summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/experimental/desktop/src/org/libreoffice/android/experimental/desktop/Desktop.java35
-rw-r--r--vcl/android/androidinst.cxx43
2 files changed, 74 insertions, 4 deletions
diff --git a/android/experimental/desktop/src/org/libreoffice/android/experimental/desktop/Desktop.java b/android/experimental/desktop/src/org/libreoffice/android/experimental/desktop/Desktop.java
index 5c5433062db1..ba3d6da05b0e 100644
--- a/android/experimental/desktop/src/org/libreoffice/android/experimental/desktop/Desktop.java
+++ b/android/experimental/desktop/src/org/libreoffice/android/experimental/desktop/Desktop.java
@@ -23,6 +23,7 @@ import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.MotionEvent;
+import android.view.ScaleGestureDetector;
import android.view.View;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
@@ -46,6 +47,7 @@ public class Desktop
public static native void renderVCL(Bitmap bitmap);
public static native void setViewSize(int width, int height);
public static native void key(char c, short timestamp);
+ public static native void touch(int action, int x, int y, short timestamp);
/**
* This class contains the state that is initialized once and never changes
@@ -152,11 +154,21 @@ public class Desktop
{
Bitmap mBitmap;
boolean renderedOnce;
+ ScaleGestureDetector gestureDetector;
public BitmapView()
{
super(Desktop.this);
setFocusableInTouchMode(true);
+ gestureDetector =
+ new ScaleGestureDetector(Desktop.this,
+ new ScaleGestureDetector.SimpleOnScaleGestureListener() {
+ @Override public boolean onScale(ScaleGestureDetector detector)
+ {
+ Log.i(TAG, "onScale: " + detector.getScaleFactor());
+ return true;
+ }
+ });
}
@Override protected void onDraw(Canvas canvas)
@@ -182,13 +194,32 @@ public class Desktop
return super.onTouchEvent(event);
super.onTouchEvent(event);
- Log.d(TAG, "onTOUCH");
- if (event.getAction() == MotionEvent.ACTION_UP) {
+ Log.d(TAG, "onTouch (" + event.getX() + "," + event.getY() + ")");
+
+ // Just temporary hack. We should not show the keyboard
+ // unconditionally on a ACTION_UP event here. The LO level
+ // should callback to us requesting showing the keyboard
+ // if the user taps in a text area. Also, if the device
+ // has a hardware keyboard, we probably should not show
+ // the soft one unconditionally? But what if the user
+ // wants to input in another script than what the hardware
+ // keyboard covers?
+ if (event.getActionMasked() == MotionEvent.ACTION_UP) {
// show the keyboard so we can enter text
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(this, InputMethodManager.SHOW_FORCED);
}
+
+ switch (event.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_MOVE:
+ short timestamp = (short) (System.currentTimeMillis() % Short.MAX_VALUE);
+ Desktop.touch(event.getActionMasked(), (int) event.getX(), (int) event.getY(), timestamp);
+ break;
+ }
+
return true;
}
diff --git a/vcl/android/androidinst.cxx b/vcl/android/androidinst.cxx
index b94855df1c75..2773cd390482 100644
--- a/vcl/android/androidinst.cxx
+++ b/vcl/android/androidinst.cxx
@@ -900,10 +900,10 @@ int AndroidSalSystem::ShowNativeDialog( const rtl::OUString& rTitle,
return 0;
}
-// Render everything
+// public static native void renderVCL(Bitmap bitmap);
extern "C" SAL_JNI_EXPORT void JNICALL
Java_org_libreoffice_experimental_desktop_Desktop_renderVCL(JNIEnv *env,
- jobject /* dummy */,
+ jobject /* clazz */,
jobject bitmap)
{
if (!bHitIdle)
@@ -963,6 +963,7 @@ typedef struct ANativeWindow_Buffer {
AndroidBitmap_unlockPixels(env, bitmap);
}
+// public static native void setViewSize(int width, int height);
extern "C" SAL_JNI_EXPORT void JNICALL
Java_org_libreoffice_experimental_desktop_Desktop_setViewSize(JNIEnv * /* env */,
jobject /* clazz */,
@@ -974,6 +975,7 @@ Java_org_libreoffice_experimental_desktop_Desktop_setViewSize(JNIEnv * /* env */
viewHeight = height;
}
+// public static native void key(char c, short timestamp);
extern "C" SAL_JNI_EXPORT void JNICALL
Java_org_libreoffice_experimental_desktop_Desktop_key(JNIEnv * /* env */,
jobject /* clazz */,
@@ -996,4 +998,41 @@ Java_org_libreoffice_experimental_desktop_Desktop_key(JNIEnv * /* env */,
LOGW("No focused frame to emit event on");
}
+// public static native void touch(int action, int x, int y, short timestamp);
+extern "C" SAL_JNI_EXPORT void JNICALL
+Java_org_libreoffice_experimental_desktop_Desktop_touch(JNIEnv * /* env */,
+ jobject /* clazz */,
+ jint action,
+ jint x,
+ jint y,
+ jshort timestamp)
+{
+ SalMouseEvent aEvent;
+
+ aEvent.mnTime = timestamp;
+ aEvent.mnX = x;
+ aEvent.mnY = y;
+ aEvent.mnButton = MOUSE_LEFT;
+ aEvent.mnCode = 0;
+
+ sal_uInt16 eventKind;
+ switch (action) {
+ case AMOTION_EVENT_ACTION_DOWN:
+ eventKind = SALEVENT_MOUSEBUTTONDOWN;
+ break;
+ case AMOTION_EVENT_ACTION_UP:
+ eventKind = SALEVENT_MOUSEBUTTONUP;
+ break;
+ case AMOTION_EVENT_ACTION_MOVE:
+ eventKind = SALEVENT_MOUSEMOVE;
+ break;
+ }
+
+ SalFrame *pFocus = AndroidSalInstance::getInstance()->getFocusFrame();
+ if (pFocus)
+ pFocus->CallCallback( eventKind, &aEvent );
+ else
+ LOGW("No focused frame to emit event on");
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */