Browse Source

implemented love.system.vibrate(seconds)

Martin Felis 11 years ago
parent
commit
6110de0fa8

+ 1 - 0
AndroidManifest.xml

@@ -4,6 +4,7 @@
       android:versionName="0.9.1a"
       android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android">
     <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-permission android:name="android.permission.VIBRATE"/>
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <!-- Allow writing to external storage -->
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

+ 11 - 0
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
 

+ 2 - 0
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
 

+ 6 - 0
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);

+ 8 - 0
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);
 

+ 8 - 0
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<double>(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 }
 };
 

+ 1 - 0
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

+ 10 - 2
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);