Kaydet (Commit) 7f5e0f85 authored tarafından Siqi Liu's avatar Siqi Liu Kaydeden (comit) Miklos Vajna

refactor swipegesture to be handled by layerview

Change-Id: Id094ffa7972df0477ad26b2fc579fe010e745550
üst 3851bd73
...@@ -144,19 +144,6 @@ public class LibreOfficeMainActivity extends LOAbout { ...@@ -144,19 +144,6 @@ public class LibreOfficeMainActivity extends LOAbout {
LayerView layerView = (LayerView) findViewById(R.id.layer_view); LayerView layerView = (LayerView) findViewById(R.id.layer_view);
mLayerClient.setView(layerView); mLayerClient.setView(layerView);
layerView.setInputConnectionHandler(new LOKitInputConnectionHandler()); layerView.setInputConnectionHandler(new LOKitInputConnectionHandler());
layerView.setOnTouchListener(new OnSlideSwipeListener(this) {
@Override
public void onSwipeRight() {
Log.d(LOGTAG, "onSwipeRight");
LOKitShell.sendSwipeRightEvent();
}
@Override
public void onSwipeLeft() {
Log.d(LOGTAG, "onSwipeLeft");
LOKitShell.sendSwipeLeftEvent();
}
});
mLayerClient.notifyReady(); mLayerClient.notifyReady();
} }
......
package org.libreoffice; package org.mozilla.gecko;
import android.content.Context; import android.content.Context;
import android.view.GestureDetector; import android.view.GestureDetector;
...@@ -6,8 +6,13 @@ import android.view.GestureDetector.SimpleOnGestureListener; ...@@ -6,8 +6,13 @@ import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.View.OnTouchListener; import android.view.View.OnTouchListener;
import android.util.Log;
import org.libreoffice.LOKitShell;
public class OnSlideSwipeListener implements OnTouchListener { public class OnSlideSwipeListener implements OnTouchListener {
private static String LOGTAG = OnSlideSwipeListener.class.getName();
private final GestureDetector mGestureDetector; private final GestureDetector mGestureDetector;
...@@ -48,9 +53,13 @@ public class OnSlideSwipeListener implements OnTouchListener { ...@@ -48,9 +53,13 @@ public class OnSlideSwipeListener implements OnTouchListener {
} }
public void onSwipeRight() { public void onSwipeRight() {
Log.d(LOGTAG, "onSwipeRight");
LOKitShell.sendSwipeRightEvent();
} }
public void onSwipeLeft() { public void onSwipeLeft() {
Log.d(LOGTAG, "onSwipeLeft");
LOKitShell.sendSwipeLeftEvent();
} }
@Override @Override
......
...@@ -28,6 +28,7 @@ import android.widget.FrameLayout; ...@@ -28,6 +28,7 @@ import android.widget.FrameLayout;
import org.libreoffice.LibreOfficeMainActivity; import org.libreoffice.LibreOfficeMainActivity;
import org.libreoffice.R; import org.libreoffice.R;
import org.mozilla.gecko.OnInterceptTouchListener; import org.mozilla.gecko.OnInterceptTouchListener;
import org.mozilla.gecko.OnSlideSwipeListener;
/** /**
* A view rendered by the layer compositor. * A view rendered by the layer compositor.
...@@ -110,347 +111,349 @@ public class LayerView extends FrameLayout { ...@@ -110,347 +111,349 @@ public class LayerView extends FrameLayout {
setFocusableInTouchMode(true); setFocusableInTouchMode(true);
createGLThread(); createGLThread();
setOnTouchListener(new OnSlideSwipeListener(getContext()));
} }
public void show() { public void show() {
// Fix this if TextureView support is turned back on above // Fix this if TextureView support is turned back on above
mSurfaceView.setVisibility(View.VISIBLE); mSurfaceView.setVisibility(View.VISIBLE);
} }
public void hide() { public void hide() {
// Fix this if TextureView support is turned back on above // Fix this if TextureView support is turned back on above
mSurfaceView.setVisibility(View.INVISIBLE); mSurfaceView.setVisibility(View.INVISIBLE);
} }
public void destroy() { public void destroy() {
if (mLayerClient != null) { if (mLayerClient != null) {
mLayerClient.destroy(); mLayerClient.destroy();
} }
if (mRenderer != null) { if (mRenderer != null) {
mRenderer.destroy(); mRenderer.destroy();
} }
} }
public void setTouchIntercepter(final OnInterceptTouchListener touchIntercepter) { public void setTouchIntercepter(final OnInterceptTouchListener touchIntercepter) {
// this gets run on the gecko thread, but for thread safety we want the assignment // this gets run on the gecko thread, but for thread safety we want the assignment
// on the UI thread. // on the UI thread.
post(new Runnable() { post(new Runnable() {
public void run() { public void run() {
mTouchIntercepter = touchIntercepter; mTouchIntercepter = touchIntercepter;
} }
}); });
} }
public void setInputConnectionHandler(InputConnectionHandler inputConnectionHandler) { public void setInputConnectionHandler(InputConnectionHandler inputConnectionHandler) {
mInputConnectionHandler = inputConnectionHandler; mInputConnectionHandler = inputConnectionHandler;
} }
@Override @Override
public boolean onTouchEvent(MotionEvent event) { public boolean onTouchEvent(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
requestFocus(); requestFocus();
} }
if (mTouchIntercepter != null && mTouchIntercepter.onInterceptTouchEvent(this, event)) { if (mTouchIntercepter != null && mTouchIntercepter.onInterceptTouchEvent(this, event)) {
return true; return true;
} }
if (mPanZoomController != null && mPanZoomController.onTouchEvent(event)) { if (mPanZoomController != null && mPanZoomController.onTouchEvent(event)) {
return true; return true;
} }
if (mTouchIntercepter != null && mTouchIntercepter.onTouch(this, event)) { if (mTouchIntercepter != null && mTouchIntercepter.onTouch(this, event)) {
return true; return true;
} }
return false; return false;
} }
@Override @Override
public boolean onHoverEvent(MotionEvent event) { public boolean onHoverEvent(MotionEvent event) {
if (mTouchIntercepter != null && mTouchIntercepter.onTouch(this, event)) { if (mTouchIntercepter != null && mTouchIntercepter.onTouch(this, event)) {
return true; return true;
} }
return false; return false;
} }
@Override @Override
public boolean onGenericMotionEvent(MotionEvent event) { public boolean onGenericMotionEvent(MotionEvent event) {
if (mPanZoomController != null && mPanZoomController.onMotionEvent(event)) { if (mPanZoomController != null && mPanZoomController.onMotionEvent(event)) {
return true; return true;
} }
return false; return false;
} }
public GeckoLayerClient getLayerClient() { return mLayerClient; } public GeckoLayerClient getLayerClient() { return mLayerClient; }
public PanZoomController getPanZoomController() { return mPanZoomController; } public PanZoomController getPanZoomController() { return mPanZoomController; }
public void setViewportSize(IntSize size) { public void setViewportSize(IntSize size) {
mLayerClient.setViewportSize(new FloatSize(size)); mLayerClient.setViewportSize(new FloatSize(size));
} }
public ImmutableViewportMetrics getViewportMetrics() { public ImmutableViewportMetrics getViewportMetrics() {
return mLayerClient.getViewportMetrics(); return mLayerClient.getViewportMetrics();
} }
@Override @Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
if (mInputConnectionHandler != null) if (mInputConnectionHandler != null)
return mInputConnectionHandler.onCreateInputConnection(outAttrs); return mInputConnectionHandler.onCreateInputConnection(outAttrs);
return null; return null;
} }
@Override @Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) { public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (mInputConnectionHandler != null) if (mInputConnectionHandler != null)
return mInputConnectionHandler.onKeyPreIme(keyCode, event); return mInputConnectionHandler.onKeyPreIme(keyCode, event);
return false; return false;
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mInputConnectionHandler != null) if (mInputConnectionHandler != null)
return mInputConnectionHandler.onKeyDown(keyCode, event); return mInputConnectionHandler.onKeyDown(keyCode, event);
return false; return false;
} }
@Override @Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) { public boolean onKeyLongPress(int keyCode, KeyEvent event) {
if (mInputConnectionHandler != null) if (mInputConnectionHandler != null)
return mInputConnectionHandler.onKeyLongPress(keyCode, event); return mInputConnectionHandler.onKeyLongPress(keyCode, event);
return false; return false;
} }
@Override @Override
public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
if (mInputConnectionHandler != null) if (mInputConnectionHandler != null)
return mInputConnectionHandler.onKeyMultiple(keyCode, repeatCount, event); return mInputConnectionHandler.onKeyMultiple(keyCode, repeatCount, event);
return false; return false;
} }
@Override @Override
public boolean onKeyUp(int keyCode, KeyEvent event) { public boolean onKeyUp(int keyCode, KeyEvent event) {
if (mInputConnectionHandler != null) if (mInputConnectionHandler != null)
return mInputConnectionHandler.onKeyUp(keyCode, event); return mInputConnectionHandler.onKeyUp(keyCode, event);
return false; return false;
} }
public boolean isIMEEnabled() { public boolean isIMEEnabled() {
/*if (mInputConnectionHandler != null) { /*if (mInputConnectionHandler != null) {
return mInputConnectionHandler.isIMEEnabled(); return mInputConnectionHandler.isIMEEnabled();
}*/ }*/
return false; return false;
} }
public void requestRender() { public void requestRender() {
if (mListener != null) { if (mListener != null) {
mListener.renderRequested(); mListener.renderRequested();
} }
} }
public void addLayer(Layer layer) { public void addLayer(Layer layer) {
mRenderer.addLayer(layer); mRenderer.addLayer(layer);
} }
public void removeLayer(Layer layer) { public void removeLayer(Layer layer) {
mRenderer.removeLayer(layer); mRenderer.removeLayer(layer);
} }
public int getMaxTextureSize() { public int getMaxTextureSize() {
return mRenderer.getMaxTextureSize(); return mRenderer.getMaxTextureSize();
} }
public void setLayerRenderer(LayerRenderer renderer) { public void setLayerRenderer(LayerRenderer renderer) {
mRenderer = renderer; mRenderer = renderer;
} }
public LayerRenderer getLayerRenderer() { public LayerRenderer getLayerRenderer() {
return mRenderer; return mRenderer;
} }
/* paintState must be a PAINT_xxx constant. The state will only be changed /* paintState must be a PAINT_xxx constant. The state will only be changed
* if paintState represents a state that occurs after the current state. */ * if paintState represents a state that occurs after the current state. */
public void setPaintState(int paintState) { public void setPaintState(int paintState) {
if (paintState > mPaintState) { if (paintState > mPaintState) {
Log.d(LOGTAG, "LayerView paint state set to " + paintState); Log.d(LOGTAG, "LayerView paint state set to " + paintState);
mPaintState = paintState; mPaintState = paintState;
} }
} }
public int getPaintState() { public int getPaintState() {
return mPaintState; return mPaintState;
} }
public LayerRenderer getRenderer() { public LayerRenderer getRenderer() {
return mRenderer; return mRenderer;
} }
public void setListener(Listener listener) { public void setListener(Listener listener) {
mListener = listener; mListener = listener;
} }
Listener getListener() { Listener getListener() {
return mListener; return mListener;
} }
public GLController getGLController() { public GLController getGLController() {
return mGLController; return mGLController;
} }
public Bitmap getDrawable(String name) { public Bitmap getDrawable(String name) {
Context context = getContext(); Context context = getContext();
Resources resources = context.getResources(); Resources resources = context.getResources();
String packageName = resources.getResourcePackageName(R.id.dummy_id_for_package_name_resolution); String packageName = resources.getResourcePackageName(R.id.dummy_id_for_package_name_resolution);
int resourceID = resources.getIdentifier(name, "drawable", packageName); int resourceID = resources.getIdentifier(name, "drawable", packageName);
BitmapFactory.Options options = new BitmapFactory.Options(); BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false; options.inScaled = false;
return BitmapFactory.decodeResource(context.getResources(), resourceID, options); return BitmapFactory.decodeResource(context.getResources(), resourceID, options);
} }
Bitmap getBackgroundPattern() { Bitmap getBackgroundPattern() {
return getDrawable("background"); return getDrawable("background");
} }
Bitmap getShadowPattern() { Bitmap getShadowPattern() {
return getDrawable("shadow"); return getDrawable("shadow");
} }
private void onSizeChanged(int width, int height) { private void onSizeChanged(int width, int height) {
mGLController.surfaceChanged(width, height); mGLController.surfaceChanged(width, height);
mLayerClient.setViewportSize(new FloatSize(width, height)); mLayerClient.setViewportSize(new FloatSize(width, height));
if (mListener != null) { if (mListener != null) {
mListener.surfaceChanged(width, height); mListener.surfaceChanged(width, height);
} }
} }
private void onDestroyed() { private void onDestroyed() {
mGLController.surfaceDestroyed(); mGLController.surfaceDestroyed();
if (mListener != null) { if (mListener != null) {
mListener.compositionPauseRequested(); mListener.compositionPauseRequested();
} }
} }
public Object getNativeWindow() { public Object getNativeWindow() {
if (mSurfaceView != null) if (mSurfaceView != null)
return mSurfaceView.getHolder(); return mSurfaceView.getHolder();
return mTextureView.getSurfaceTexture(); return mTextureView.getSurfaceTexture();
} }
/** This function is invoked by Gecko (compositor thread) via JNI; be careful when modifying signature. */ /** This function is invoked by Gecko (compositor thread) via JNI; be careful when modifying signature. */
public static GLController registerCxxCompositor() { public static GLController registerCxxCompositor() {
try { try {
LayerView layerView = LibreOfficeMainActivity.mAppContext.getLayerClient().getView(); LayerView layerView = LibreOfficeMainActivity.mAppContext.getLayerClient().getView();
layerView.mListener.compositorCreated(); layerView.mListener.compositorCreated();
return layerView.getGLController(); return layerView.getGLController();
} catch (Exception e) { } catch (Exception e) {
Log.e(LOGTAG, "Error registering compositor!", e); Log.e(LOGTAG, "Error registering compositor!", e);
return null; return null;
} }
} }
public interface Listener { public interface Listener {
void compositorCreated(); void compositorCreated();
void renderRequested(); void renderRequested();
void compositionPauseRequested(); void compositionPauseRequested();
void compositionResumeRequested(int width, int height); void compositionResumeRequested(int width, int height);
void surfaceChanged(int width, int height); void surfaceChanged(int width, int height);
} }
private class SurfaceListener implements SurfaceHolder.Callback { private class SurfaceListener implements SurfaceHolder.Callback {
public void surfaceChanged(SurfaceHolder holder, int format, int width, public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) { int height) {
onSizeChanged(width, height); onSizeChanged(width, height);
} }
public void surfaceCreated(SurfaceHolder holder) { public void surfaceCreated(SurfaceHolder holder) {
if (mRenderControllerThread != null) { if (mRenderControllerThread != null) {
mRenderControllerThread.surfaceCreated(); mRenderControllerThread.surfaceCreated();
}
} }
}
public void surfaceDestroyed(SurfaceHolder holder) { public void surfaceDestroyed(SurfaceHolder holder) {
onDestroyed(); onDestroyed();
} }
} }
@Override @Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom); super.onLayout(changed, left, top, right, bottom);
if (changed) { if (changed) {
setViewportSize(new IntSize(right - left, bottom - top)); setViewportSize(new IntSize(right - left, bottom - top));
} }
} }
private class SurfaceTextureListener implements TextureView.SurfaceTextureListener { private class SurfaceTextureListener implements TextureView.SurfaceTextureListener {
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
// We don't do this for surfaceCreated above because it is always followed by a surfaceChanged, // We don't do this for surfaceCreated above because it is always followed by a surfaceChanged,
// but that is not the case here. // but that is not the case here.
if (mRenderControllerThread != null) { if (mRenderControllerThread != null) {
mRenderControllerThread.surfaceCreated(); mRenderControllerThread.surfaceCreated();
}
onSizeChanged(width, height);
} }
onSizeChanged(width, height);
}
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
onDestroyed(); onDestroyed();
return true; // allow Android to call release() on the SurfaceTexture, we are done drawing to it return true; // allow Android to call release() on the SurfaceTexture, we are done drawing to it
} }
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
onSizeChanged(width, height); onSizeChanged(width, height);
} }
public void onSurfaceTextureUpdated(SurfaceTexture surface) { public void onSurfaceTextureUpdated(SurfaceTexture surface) {
} }
} }
private RenderControllerThread mRenderControllerThread; private RenderControllerThread mRenderControllerThread;
public synchronized void createGLThread() { public synchronized void createGLThread() {
if (mRenderControllerThread != null) { if (mRenderControllerThread != null) {
throw new LayerViewException ("createGLThread() called with a GL thread already in place!"); throw new LayerViewException ("createGLThread() called with a GL thread already in place!");
} }
Log.e(LOGTAG, "### Creating GL thread!"); Log.e(LOGTAG, "### Creating GL thread!");
mRenderControllerThread = new RenderControllerThread(mGLController); mRenderControllerThread = new RenderControllerThread(mGLController);
mRenderControllerThread.start(); mRenderControllerThread.start();
setListener(mRenderControllerThread); setListener(mRenderControllerThread);
notifyAll(); notifyAll();
} }
public synchronized Thread destroyGLThread() { public synchronized Thread destroyGLThread() {
// Wait for the GL thread to be started. // Wait for the GL thread to be started.
Log.e(LOGTAG, "### Waiting for GL thread to be created..."); Log.e(LOGTAG, "### Waiting for GL thread to be created...");
while (mRenderControllerThread == null) { while (mRenderControllerThread == null) {
try { try {
wait(); wait();
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
}
} }
}
Log.e(LOGTAG, "### Destroying GL thread!"); Log.e(LOGTAG, "### Destroying GL thread!");
Thread thread = mRenderControllerThread; Thread thread = mRenderControllerThread;
mRenderControllerThread.shutdown(); mRenderControllerThread.shutdown();
setListener(null); setListener(null);
mRenderControllerThread = null; mRenderControllerThread = null;
return thread; return thread;
} }
public static class LayerViewException extends RuntimeException { public static class LayerViewException extends RuntimeException {
public static final long serialVersionUID = 1L; public static final long serialVersionUID = 1L;
LayerViewException(String e) { LayerViewException(String e) {
super(e); super(e);
} }
} }
public void setFullScreen(boolean fullScreen) { public void setFullScreen(boolean fullScreen) {
mFullScreen = fullScreen; mFullScreen = fullScreen;
} }
public boolean isFullScreen() { public boolean isFullScreen() {
return mFullScreen; return mFullScreen;
} }
} }
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