diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index fa0108ebf9..26092098cb 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -3,7 +3,7 @@
package="com.mapswithme.maps"
android:versionCode="1"
android:versionName="1.0">
-
+
-#define LOG(...) __android_log_print(ANDROID_LOG_INFO, "main_native", __VA_ARGS__)
+#define LOG(...) __android_log_print(ANDROID_LOG_INFO, "mapswithme", __VA_ARGS__)
namespace jni_help
{
+ // Some examples of sig:
+ // "()V" - void function returning void;
+ // "(Ljava/lang/String;)V" - String function returning void;
jmethodID GetJavaMethodID(JNIEnv * env, jobject obj,
- char const * fn, char const * sig)
+ char const * fn, char const * sig)
{
jclass cls = env->GetObjectClass(obj);
jmethodID mid = env->GetMethodID(cls, fn, sig);
@@ -39,6 +42,7 @@ namespace jni_help
extern "C"
{
+ /* Some dummy functions.
JNIEXPORT jstring JNICALL
Java_com_mapswithme_maps_MWMActivity_stringsJNI(JNIEnv * env, jobject thiz, jstring s)
{
@@ -65,4 +69,22 @@ extern "C"
LOG("Leave callbackFromJNI");
}
+ */
+
+ JNIEXPORT void JNICALL
+ Java_com_mapswithme_maps_MainGLView_nativeInit(JNIEnv * env, jobject thiz)
+ {
+ }
+
+ JNIEXPORT void JNICALL
+ Java_com_mapswithme_maps_GesturesProcessor_nativeMove(JNIEnv * env, jobject thiz,
+ jint mode, jdouble x, jdouble y)
+ {
+ }
+
+ JNIEXPORT void JNICALL
+ Java_com_mapswithme_maps_GesturesProcessor_nativeZoom(JNIEnv * env, jobject thiz,
+ jint mode, jdouble x1, jdouble y1, jdouble x2, jdouble y2)
+ {
+ }
}
diff --git a/android/src/com/mapswithme/maps/GesturesProcessor.java b/android/src/com/mapswithme/maps/GesturesProcessor.java
new file mode 100644
index 0000000000..08c4786891
--- /dev/null
+++ b/android/src/com/mapswithme/maps/GesturesProcessor.java
@@ -0,0 +1,84 @@
+package com.mapswithme.maps;
+
+import android.graphics.PointF;
+import android.view.MotionEvent;
+
+
+public class GesturesProcessor
+{
+ private final int NONE = 0;
+ private final int MOVE = 1;
+ private final int ZOOM = 2;
+
+ // Do not modify this constant values (or take into account native code, please).
+ private final int START = 0;
+ private final int PROCESS = 1;
+ private final int END = 2;
+
+ private PointF m_pt1;
+ private PointF m_pt2;
+ private int m_mode;
+
+ private void getPointsMove(MotionEvent e)
+ {
+ m_pt1.set(e.getX(), e.getY());
+ }
+
+ private void getPointsZoom(MotionEvent e)
+ {
+ m_pt1.set(e.getX(0), e.getY(0));
+ m_pt2.set(e.getX(1), e.getY(1));
+ }
+
+ public GesturesProcessor()
+ {
+ m_pt1 = new PointF();
+ m_pt2 = new PointF();
+ m_mode = NONE;
+ }
+
+ public void onTouchEvent(MotionEvent e)
+ {
+ switch (e.getAction() & MotionEvent.ACTION_MASK)
+ {
+ case MotionEvent.ACTION_DOWN:
+ getPointsMove(e);
+ m_mode = MOVE;
+ nativeMove(START, m_pt1.x, m_pt1.y);
+ break;
+
+ case MotionEvent.ACTION_POINTER_DOWN:
+ getPointsZoom(e);
+ nativeZoom(START, m_pt1.x, m_pt1.y, m_pt2.x, m_pt2.y);
+ break;
+
+ case MotionEvent.ACTION_UP:
+ getPointsMove(e);
+ nativeMove(END, m_pt1.x, m_pt1.y);
+ m_mode = NONE;
+ break;
+
+ case MotionEvent.ACTION_POINTER_UP:
+ getPointsZoom(e);
+ nativeZoom(END, m_pt1.x, m_pt1.y, m_pt2.x, m_pt2.y);
+ m_mode = NONE;
+ break;
+
+ case MotionEvent.ACTION_MOVE:
+ if (m_mode == MOVE)
+ {
+ getPointsMove(e);
+ nativeMove(PROCESS, m_pt1.x, m_pt1.y);
+ }
+ else if (m_mode == ZOOM)
+ {
+ getPointsZoom(e);
+ nativeZoom(PROCESS, m_pt1.x, m_pt1.y, m_pt2.x, m_pt2.y);
+ }
+ break;
+ }
+ }
+
+ private native void nativeMove(int mode, double x, double y);
+ private native void nativeZoom(int mode, double x1, double y1, double x2, double y2);
+}
diff --git a/android/src/com/mapswithme/maps/MWMActivity.java b/android/src/com/mapswithme/maps/MWMActivity.java
index d8679fcc1e..eeed043fc5 100644
--- a/android/src/com/mapswithme/maps/MWMActivity.java
+++ b/android/src/com/mapswithme/maps/MWMActivity.java
@@ -1,15 +1,41 @@
package com.mapswithme.maps;
+import com.mapswithme.maps.MainGLView;
+
import android.app.Activity;
import android.os.Bundle;
+
public class MWMActivity extends Activity
{
- /** Called when the activity is first created. */
+ private MainGLView m_view;
+
@Override
public void onCreate(Bundle savedInstanceState)
{
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
+ super.onCreate(savedInstanceState);
+
+ m_view = new MainGLView(getApplication());
+
+ setContentView(m_view);
+ }
+
+ @Override
+ protected void onPause()
+ {
+ super.onPause();
+ m_view.onPause();
+ }
+
+ @Override
+ protected void onResume()
+ {
+ super.onResume();
+ m_view.onResume();
+ }
+
+ static
+ {
+ System.loadLibrary("mapswithme");
}
}
diff --git a/android/src/com/mapswithme/maps/MainGLView.java b/android/src/com/mapswithme/maps/MainGLView.java
new file mode 100644
index 0000000000..4bd5dda0ca
--- /dev/null
+++ b/android/src/com/mapswithme/maps/MainGLView.java
@@ -0,0 +1,69 @@
+package com.mapswithme.maps;
+
+import com.mapswithme.maps.GesturesProcessor;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import android.content.Context;
+import android.opengl.GLSurfaceView;
+import android.util.Log;
+import android.view.MotionEvent;
+
+
+public class MainGLView extends GLSurfaceView
+{
+ private static String TAG = "MainGLView";
+
+ GesturesProcessor m_gestures;
+
+ public MainGLView(Context context)
+ {
+ super(context);
+ init();
+ }
+
+ private void init()
+ {
+ m_gestures = new GesturesProcessor();
+
+ // Do native initialization with OpenGL.
+ nativeInit();
+
+ setRenderer(new Renderer());
+
+ // When renderMode is RENDERMODE_WHEN_DIRTY, the renderer only rendered
+ // when the surface is created, or when requestRender() is called.
+ setRenderMode(RENDERMODE_WHEN_DIRTY);
+ }
+
+ private static class Renderer implements GLSurfaceView.Renderer
+ {
+ @Override
+ public void onDrawFrame(GL10 gl)
+ {
+ Log.i(TAG, "Renderer::onDrawFrame");
+ }
+
+ @Override
+ public void onSurfaceChanged(GL10 gl, int width, int height)
+ {
+ Log.i(TAG, "Renderer::onSurfaceChanged");
+ }
+
+ @Override
+ public void onSurfaceCreated(GL10 gl, EGLConfig config)
+ {
+ Log.i(TAG, "Renderer::onSurfaceCreated");
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent e)
+ {
+ m_gestures.onTouchEvent(e);
+ return true; // if handled
+ }
+
+ private native void nativeInit();
+}