diff -r f8588afb6486 android-project/default.properties --- a/android-project/default.properties Mon Feb 28 23:50:32 2011 -0800 +++ b/android-project/default.properties Wed Mar 02 18:07:41 2011 +0100 @@ -8,4 +8,4 @@ # project structure. # Project target. -target=android-4 +target=android-7 diff -r f8588afb6486 android-project/src/org/libsdl/app/SDLActivity.java --- a/android-project/src/org/libsdl/app/SDLActivity.java Mon Feb 28 23:50:32 2011 -0800 +++ b/android-project/src/org/libsdl/app/SDLActivity.java Wed Mar 02 18:07:41 2011 +0100 @@ -95,6 +95,8 @@ public static native void onNativeKeyUp(int keycode); public static native void onNativeTouch(int action, float x, float y, float p); + public static native void onNativeMultiTouch(int action, float x, + float y, int pointerId, float pressure); public static native void onNativeAccel(float x, float y, float z); public static native void nativeRunAudioThread(); @@ -244,6 +246,21 @@ // Sensors private static SensorManager mSensorManager; + private static final int touchEventMax = 16; // Max multitouch pointers + private static touchEvent touchEvents[]; + private static boolean multiTouch = true; + private static class touchEvent + { + public boolean down = false; + public float x = 0; + public float y = 0; + public float pressure = 0; + } + static { + touchEvents = new touchEvent[touchEventMax]; + for( int i = 0; i < touchEventMax; i++ ) + touchEvents[i] = new touchEvent(); + } // Startup public SDLSurface(Context context) { @@ -456,6 +473,76 @@ // Touch events public boolean onTouch(View v, MotionEvent event) { + if (multiTouch) + { + int action = -1; + if( event.getAction() == MotionEvent.ACTION_UP ) + { + action = 1; + for( int i = 0; i < touchEventMax; i++ ) + { + if( touchEvents[i].down ) + { + touchEvents[i].down = false; + SDLActivity.onNativeMultiTouch(action, touchEvents[i].x, touchEvents[i].y, i, touchEvents[i].pressure); + } + } + } + if( event.getAction() == MotionEvent.ACTION_DOWN ) + { + action = 0; + for( int i = 0; i < event.getPointerCount(); i++ ) + { + int id = event.getPointerId(i); + if( id >= touchEventMax ) + id = touchEventMax-1; + touchEvents[id].down = true; + touchEvents[id].x = event.getX(i); + touchEvents[id].y = event.getY(i); + touchEvents[id].pressure = event.getPressure(i); + SDLActivity.onNativeMultiTouch(action, touchEvents[id].x, touchEvents[id].y, id, touchEvents[id].pressure); + } + } + + if( event.getAction() == MotionEvent.ACTION_MOVE ) + { + for( int i = 0; i < touchEventMax; i++ ) + { + int ii; + for( ii = 0; ii < event.getPointerCount(); ii++ ) + { + if( i == event.getPointerId(ii) ) + break; + } + if( ii >= event.getPointerCount() ) + { + // Up event + if( touchEvents[i].down ) + { + action = 1; + touchEvents[i].down = false; + SDLActivity.onNativeMultiTouch(action, touchEvents[i].x, touchEvents[i].y, i, touchEvents[i].pressure); + } + } + else + { + int id = event.getPointerId(ii); + if( id >= touchEventMax ) + id = touchEventMax-1; + if( touchEvents[id].down ) + action = 2; + else + action = 0; + touchEvents[id].down = true; + touchEvents[id].x = event.getX(i); + touchEvents[id].y = event.getY(i); + touchEvents[id].pressure = event.getPressure(i); + SDLActivity.onNativeMultiTouch(action, touchEvents[id].x, touchEvents[id].y, id, touchEvents[id].pressure); + } + } + } + return true; + } int action = event.getAction(); float x = event.getX(); float y = event.getY(); diff -r f8588afb6486 src/core/android/SDL_android.cpp --- a/src/core/android/SDL_android.cpp Mon Feb 28 23:50:32 2011 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,263 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2011 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" -#include "SDL_stdinc.h" - -#include "SDL_android.h" - -extern "C" { -#include "../../events/SDL_events_c.h" -#include "../../video/android/SDL_androidkeyboard.h" -#include "../../video/android/SDL_androidtouch.h" -#include "../../video/android/SDL_androidvideo.h" - -/* Impelemented in audio/android/SDL_androidaudio.c */ -extern void Android_RunAudioThread(); -} // C - -/******************************************************************************* - This file links the Java side of Android with libsdl -*******************************************************************************/ -#include -#include - - -/******************************************************************************* - Globals -*******************************************************************************/ -static JNIEnv* mEnv = NULL; -static JNIEnv* mAudioEnv = NULL; - -// Main activity -static jclass mActivityClass; - -// method signatures -static jmethodID midCreateGLContext; -static jmethodID midFlipBuffers; -static jmethodID midAudioInit; -static jmethodID midAudioWriteShortBuffer; -static jmethodID midAudioWriteByteBuffer; -static jmethodID midAudioQuit; - -// Accelerometer data storage -static float fLastAccelerometer[3]; - - -/******************************************************************************* - Functions called by JNI -*******************************************************************************/ - -// Library init -extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) -{ - return JNI_VERSION_1_4; -} - -// Called before SDL_main() to initialize JNI bindings -extern "C" void SDL_Android_Init(JNIEnv* env, jclass cls) -{ - __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL_Android_Init()"); - - mEnv = env; - mActivityClass = cls; - - midCreateGLContext = mEnv->GetStaticMethodID(mActivityClass, - "createGLContext","(II)Z"); - midFlipBuffers = mEnv->GetStaticMethodID(mActivityClass, - "flipBuffers","()V"); - midAudioInit = mEnv->GetStaticMethodID(mActivityClass, - "audioInit", "(IZZI)Ljava/lang/Object;"); - midAudioWriteShortBuffer = mEnv->GetStaticMethodID(mActivityClass, - "audioWriteShortBuffer", "([S)V"); - midAudioWriteByteBuffer = mEnv->GetStaticMethodID(mActivityClass, - "audioWriteByteBuffer", "([B)V"); - midAudioQuit = mEnv->GetStaticMethodID(mActivityClass, - "audioQuit", "()V"); - - if(!midCreateGLContext || !midFlipBuffers || !midAudioInit || - !midAudioWriteShortBuffer || !midAudioWriteByteBuffer || !midAudioQuit) { - __android_log_print(ANDROID_LOG_WARN, "SDL", "SDL: Couldn't locate Java callbacks, check that they're named and typed correctly"); - } -} - -// Resize -extern "C" void Java_org_libsdl_app_SDLActivity_onNativeResize( - JNIEnv* env, jclass jcls, - jint width, jint height, jint format) -{ - Android_SetScreenResolution(width, height, format); -} - -// Keydown -extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyDown( - JNIEnv* env, jclass jcls, jint keycode) -{ - Android_OnKeyDown(keycode); -} - -// Keyup -extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyUp( - JNIEnv* env, jclass jcls, jint keycode) -{ - Android_OnKeyUp(keycode); -} - -// Touch -extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch( - JNIEnv* env, jclass jcls, - jint action, jfloat x, jfloat y, jfloat p) -{ - Android_OnTouch(action, x, y, p); -} - -// Accelerometer -extern "C" void Java_org_libsdl_app_SDLActivity_onNativeAccel( - JNIEnv* env, jclass jcls, - jfloat x, jfloat y, jfloat z) -{ - fLastAccelerometer[0] = x; - fLastAccelerometer[1] = y; - fLastAccelerometer[2] = z; -} - -// Quit -extern "C" void Java_org_libsdl_app_SDLActivity_nativeQuit( - JNIEnv* env, jclass cls) -{ - // Inject a SDL_QUIT event - SDL_SendQuit(); -} - -extern "C" void Java_org_libsdl_app_SDLActivity_nativeRunAudioThread( - JNIEnv* env, jclass cls) -{ - /* This is the audio thread, with a different environment */ - mAudioEnv = env; - - Android_RunAudioThread(); -} - - -/******************************************************************************* - Functions called by SDL into Java -*******************************************************************************/ -extern "C" SDL_bool Android_JNI_CreateContext(int majorVersion, int minorVersion) -{ - if (mEnv->CallStaticBooleanMethod(mActivityClass, midCreateGLContext, majorVersion, minorVersion)) { - return SDL_TRUE; - } else { - return SDL_FALSE; - } -} - -extern "C" void Android_JNI_SwapWindow() -{ - mEnv->CallStaticVoidMethod(mActivityClass, midFlipBuffers); -} - -extern "C" void Android_JNI_SetActivityTitle(const char *title) -{ - jmethodID mid; - - mid = mEnv->GetStaticMethodID(mActivityClass,"setActivityTitle","(Ljava/lang/String;)V"); - if (mid) { - mEnv->CallStaticVoidMethod(mActivityClass, mid, mEnv->NewStringUTF(title)); - } -} - -extern "C" void Android_JNI_GetAccelerometerValues(float values[3]) -{ - int i; - for (i = 0; i < 3; ++i) { - values[i] = fLastAccelerometer[i]; - } -} - -// -// Audio support -// -static jboolean audioBuffer16Bit = JNI_FALSE; -static jboolean audioBufferStereo = JNI_FALSE; -static jobject audioBuffer = NULL; -static void* audioBufferPinned = NULL; - -extern "C" int Android_JNI_OpenAudioDevice(int sampleRate, int is16Bit, int channelCount, int desiredBufferFrames) -{ - int audioBufferFrames; - - __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "SDL audio: opening device"); - audioBuffer16Bit = is16Bit; - audioBufferStereo = channelCount > 1; - - audioBuffer = mEnv->CallStaticObjectMethod(mActivityClass, midAudioInit, sampleRate, audioBuffer16Bit, audioBufferStereo, desiredBufferFrames); - - if (audioBuffer == NULL) { - __android_log_print(ANDROID_LOG_WARN, "SDL", "SDL audio: didn't get back a good audio buffer!"); - return 0; - } - audioBuffer = mEnv->NewGlobalRef(audioBuffer); - - jboolean isCopy = JNI_FALSE; - if (audioBuffer16Bit) { - audioBufferPinned = mEnv->GetShortArrayElements((jshortArray)audioBuffer, &isCopy); - audioBufferFrames = mEnv->GetArrayLength((jshortArray)audioBuffer); - } else { - audioBufferPinned = mEnv->GetByteArrayElements((jbyteArray)audioBuffer, &isCopy); - audioBufferFrames = mEnv->GetArrayLength((jbyteArray)audioBuffer); - } - if (audioBufferStereo) { - audioBufferFrames /= 2; - } - - return audioBufferFrames; -} - -extern "C" void * Android_JNI_GetAudioBuffer() -{ - return audioBufferPinned; -} - -extern "C" void Android_JNI_WriteAudioBuffer() -{ - if (audioBuffer16Bit) { - mAudioEnv->ReleaseShortArrayElements((jshortArray)audioBuffer, (jshort *)audioBufferPinned, JNI_COMMIT); - mAudioEnv->CallStaticVoidMethod(mActivityClass, midAudioWriteShortBuffer, (jshortArray)audioBuffer); - } else { - mAudioEnv->ReleaseByteArrayElements((jbyteArray)audioBuffer, (jbyte *)audioBufferPinned, JNI_COMMIT); - mAudioEnv->CallStaticVoidMethod(mActivityClass, midAudioWriteByteBuffer, (jbyteArray)audioBuffer); - } - - /* JNI_COMMIT means the changes are committed to the VM but the buffer remains pinned */ -} - -extern "C" void Android_JNI_CloseAudioDevice() -{ - mEnv->CallStaticVoidMethod(mActivityClass, midAudioQuit); - - if (audioBuffer) { - mEnv->DeleteGlobalRef(audioBuffer); - audioBuffer = NULL; - audioBufferPinned = NULL; - } -} - -/* vi: set ts=4 sw=4 expandtab: */ diff -r f8588afb6486 src/video/android/SDL_androidtouch.c --- a/src/video/android/SDL_androidtouch.c Mon Feb 28 23:50:32 2011 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2011 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#include - -#include "SDL_events.h" -#include "../../events/SDL_mouse_c.h" - -#include "SDL_androidtouch.h" - - -#define ACTION_DOWN 0 -#define ACTION_UP 1 -#define ACTION_MOVE 2 -#define ACTION_CANCEL 3 -#define ACTION_OUTSIDE 4 - -void Android_OnTouch(int action, float x, float y, float p) -{ - if (!Android_Window) { - return; - } - - if ((action != ACTION_CANCEL) && (action != ACTION_OUTSIDE)) { - SDL_SetMouseFocus(Android_Window); - SDL_SendMouseMotion(Android_Window, 0, (int)x, (int)y); - switch(action) { - case ACTION_DOWN: - SDL_SendMouseButton(Android_Window, SDL_PRESSED, SDL_BUTTON_LEFT); - break; - case ACTION_UP: - SDL_SendMouseButton(Android_Window, SDL_RELEASED, SDL_BUTTON_LEFT); - break; - } - } else { - SDL_SetMouseFocus(NULL); - } -} - -/* vi: set ts=4 sw=4 expandtab: */ diff -r f8588afb6486 src/video/android/SDL_androidtouch.h --- a/src/video/android/SDL_androidtouch.h Mon Feb 28 23:50:32 2011 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2011 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#include "SDL_androidvideo.h" - -extern void Android_OnTouch(int action, float x, float y, float p); - -/* vi: set ts=4 sw=4 expandtab: */