From 6110de0fa8197f78b88cc8c7babdf8af4ddbcac2 Mon Sep 17 00:00:00 2001 From: Martin Felis Date: Mon, 18 Aug 2014 18:47:13 +0200 Subject: [PATCH] implemented love.system.vibrate(seconds) --- AndroidManifest.xml | 1 + jni/love/src/common/android.cpp | 11 +++++++++++ jni/love/src/common/android.h | 2 ++ jni/love/src/modules/system/System.cpp | 6 ++++++ jni/love/src/modules/system/System.h | 8 ++++++++ jni/love/src/modules/system/wrap_System.cpp | 8 ++++++++ jni/love/src/modules/system/wrap_System.h | 1 + src/org/love2d/android/GameActivity.java | 12 ++++++++++-- 8 files changed, 47 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7adc631d..1ec1a027 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -4,6 +4,7 @@ android:versionName="0.9.1a" android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android"> + diff --git a/jni/love/src/common/android.cpp b/jni/love/src/common/android.cpp index 7cf109cc..fd623e44 100644 --- a/jni/love/src/common/android.cpp +++ b/jni/love/src/common/android.cpp @@ -91,6 +91,17 @@ bool openURL(const std::string &url) return true; } +void vibrate (double seconds) +{ + JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv(); + jclass activity = env->FindClass("org/love2d/android/GameActivity"); + + jmethodID vibrate_method = env->GetStaticMethodID(activity, "vibrate", "(D)V"); + env->CallStaticVoidMethod(activity, vibrate_method, seconds); + + env->DeleteLocalRef (activity); +} + } // android } // love diff --git a/jni/love/src/common/android.h b/jni/love/src/common/android.h index b8864def..14fbf3bf 100644 --- a/jni/love/src/common/android.h +++ b/jni/love/src/common/android.h @@ -45,6 +45,8 @@ const char* getSelectedGameFile(); bool openURL (const std::string &url); +void vibrate (double seconds); + } // android } // love diff --git a/jni/love/src/modules/system/System.cpp b/jni/love/src/modules/system/System.cpp index 8c59478e..849de95b 100755 --- a/jni/love/src/modules/system/System.cpp +++ b/jni/love/src/modules/system/System.cpp @@ -118,6 +118,12 @@ bool System::openURL(const std::string &url) const #endif } +void System::vibrate(double seconds) const { +#ifdef LOVE_ANDROID + love::android::vibrate (seconds); +#endif +} + bool System::getConstant(const char *in, System::PowerState &out) { return powerStates.find(in, out); diff --git a/jni/love/src/modules/system/System.h b/jni/love/src/modules/system/System.h index 212a4be0..615ecd44 100644 --- a/jni/love/src/modules/system/System.h +++ b/jni/love/src/modules/system/System.h @@ -95,6 +95,14 @@ public: **/ virtual bool openURL(const std::string &url) const; + /** + * Vibrates for the specified amount of seconds. + * + * @param number of seconds to vibrate. + * + */ + virtual void vibrate(double seconds) const; + static bool getConstant(const char *in, PowerState &out); static bool getConstant(PowerState in, const char *&out); diff --git a/jni/love/src/modules/system/wrap_System.cpp b/jni/love/src/modules/system/wrap_System.cpp index a5a2e993..d5b96426 100644 --- a/jni/love/src/modules/system/wrap_System.cpp +++ b/jni/love/src/modules/system/wrap_System.cpp @@ -86,6 +86,13 @@ int w_openURL(lua_State *L) return 1; } +int w_vibrate(lua_State *L) +{ + double seconds = static_cast(luaL_checknumber(L, 1)); + instance->vibrate(seconds); + return 0; +} + static const luaL_Reg functions[] = { { "getOS", w_getOS }, @@ -94,6 +101,7 @@ static const luaL_Reg functions[] = { "getClipboardText", w_getClipboardText }, { "getPowerInfo", w_getPowerInfo }, { "openURL", w_openURL }, + { "vibrate", w_vibrate }, { 0, 0 } }; diff --git a/jni/love/src/modules/system/wrap_System.h b/jni/love/src/modules/system/wrap_System.h index 9d89240a..3ae73e0b 100644 --- a/jni/love/src/modules/system/wrap_System.h +++ b/jni/love/src/modules/system/wrap_System.h @@ -36,6 +36,7 @@ int w_setClipboardText(lua_State *L); int w_getClipboardText(lua_State *L); int w_getPowerInfo(lua_State *L); int w_openURL(lua_State *L); +int w_vibrate(lua_State *L); extern "C" LOVE_EXPORT int luaopen_love_system(lua_State *L); } // system diff --git a/src/org/love2d/android/GameActivity.java b/src/org/love2d/android/GameActivity.java index 79bb95d2..0730cd7e 100644 --- a/src/org/love2d/android/GameActivity.java +++ b/src/org/love2d/android/GameActivity.java @@ -24,6 +24,7 @@ import android.os.Environment; import android.os.Handler; import android.os.PowerManager; import android.os.ResultReceiver; +import android.os.Vibrator; import android.util.Log; import android.util.DisplayMetrics; import android.widget.Toast; @@ -32,12 +33,14 @@ public class GameActivity extends SDLActivity { private static DisplayMetrics metrics = new DisplayMetrics(); private static String gamePath = ""; private static Context context; - + private static Vibrator vibrator; + @Override protected void onCreate(Bundle savedInstanceState) { Log.d("GameActivity", "started"); - + context = this.getApplicationContext(); + vibrator = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE); Uri game = this.getIntent().getData(); if (game != null) { @@ -62,6 +65,11 @@ public class GameActivity extends SDLActivity { return metrics; } + public static void vibrate (double seconds) { + Log.d ("GameActivity", "vibrating for " + seconds + " seconds"); + vibrator.vibrate((long) (seconds * 1000.)); + }milli + public static void openURL (String url) { Log.d ("GameActivity", "opening url = " + url); Intent i = new Intent(Intent.ACTION_VIEW);