Add API to find out if there is a vibrator.

Change-Id: If29f6ee19448222433cad9fad325d0095a8e5737
diff --git a/api/current.xml b/api/current.xml
index 0df3891..c7cddac 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -142511,6 +142511,17 @@
  visibility="public"
 >
 </method>
+<method name="hasVibrator"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="vibrate"
  return="void"
  abstract="false"
diff --git a/core/java/android/os/IVibratorService.aidl b/core/java/android/os/IVibratorService.aidl
index c98fb56..2c2fe8a 100755
--- a/core/java/android/os/IVibratorService.aidl
+++ b/core/java/android/os/IVibratorService.aidl
@@ -19,6 +19,7 @@
 /** {@hide} */
 interface IVibratorService
 {
+    boolean hasVibrator();
     void vibrate(long milliseconds, IBinder token);
     void vibratePattern(in long[] pattern, int repeat, IBinder token);
     void cancelVibrate(IBinder token);
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index be818da..e9428f7 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -38,6 +38,22 @@
     }
 
     /**
+     * Check whether the hardware has a vibrator.  Returns true if a vibrator
+     * exists, else false.
+     */
+    public boolean hasVibrator() {
+        if (mService == null) {
+            Log.w(TAG, "Failed to vibrate; no vibrator service.");
+            return false;
+        }
+        try {
+            return mService.hasVibrator();
+        } catch (RemoteException e) {
+        }
+        return false;
+    }
+    
+    /**
      * Turn the vibrator on.
      *
      * @param milliseconds How long to vibrate for.
diff --git a/services/java/com/android/server/VibratorService.java b/services/java/com/android/server/VibratorService.java
index f0b5955..2fcdb5d 100755
--- a/services/java/com/android/server/VibratorService.java
+++ b/services/java/com/android/server/VibratorService.java
@@ -112,6 +112,10 @@
         context.registerReceiver(mIntentReceiver, filter);
     }
 
+    public boolean hasVibrator() {
+        return vibratorExists();
+    }
+    
     public void vibrate(long milliseconds, IBinder token) {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)
                 != PackageManager.PERMISSION_GRANTED) {
@@ -380,6 +384,7 @@
 
     volatile VibrateThread mThread;
 
+    native static boolean vibratorExists();
     native static void vibratorOn(long milliseconds);
     native static void vibratorOff();
 }
diff --git a/services/jni/com_android_server_VibratorService.cpp b/services/jni/com_android_server_VibratorService.cpp
index 6ec5c07..0912d43 100644
--- a/services/jni/com_android_server_VibratorService.cpp
+++ b/services/jni/com_android_server_VibratorService.cpp
@@ -29,6 +29,11 @@
 namespace android
 {
 
+static jboolean vibratorExists(JNIEnv *env, jobject clazz)
+{
+    return vibrator_exists() > 0 ? JNI_TRUE : JNI_FALSE;
+}
+
 static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms)
 {
     // LOGI("vibratorOn\n");
@@ -42,6 +47,7 @@
 }
 
 static JNINativeMethod method_table[] = {
+    { "vibratorExists", "()Z", (void*)vibratorExists },
     { "vibratorOn", "(J)V", (void*)vibratorOn },
     { "vibratorOff", "()V", (void*)vibratorOff }
 };