diff options
| -rw-r--r-- | services/core/java/com/android/server/VibratorService.java | 2 | ||||
| -rw-r--r-- | services/core/jni/com_android_server_VibratorService.cpp | 49 |
2 files changed, 45 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 20f6f1ccffec..9557ebde794b 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -82,6 +82,7 @@ public class VibratorService extends IVibratorService.Stub private SettingsObserver mSettingObserver; native static boolean vibratorExists(); + native static void vibratorInit(); native static void vibratorOn(long milliseconds); native static void vibratorOff(); @@ -147,6 +148,7 @@ public class VibratorService extends IVibratorService.Stub } VibratorService(Context context) { + vibratorInit(); // Reset the hardware to a default state, in case this is a runtime // restart instead of a fresh boot. vibratorOff(); diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp index fb1166b41d41..b8e004f06ee6 100644 --- a/services/core/jni/com_android_server_VibratorService.cpp +++ b/services/core/jni/com_android_server_VibratorService.cpp @@ -22,32 +22,69 @@ #include <utils/misc.h> #include <utils/Log.h> -#include <hardware_legacy/vibrator.h> +#include <hardware/vibrator.h> #include <stdio.h> namespace android { +static hw_module_t *gVibraModule = NULL; +static vibrator_device_t *gVibraDevice = NULL; + +static void vibratorInit(JNIEnv /* env */, jobject /* clazz */) +{ + if (gVibraModule != NULL) { + return; + } + + int err = hw_get_module(VIBRATOR_HARDWARE_MODULE_ID, (hw_module_t const**)&gVibraModule); + + if (err) { + ALOGE("Couldn't load %s module (%s)", VIBRATOR_HARDWARE_MODULE_ID, strerror(-err)); + } else { + if (gVibraModule) { + vibrator_open(gVibraModule, &gVibraDevice); + } + } +} + static jboolean vibratorExists(JNIEnv* /* env */, jobject /* clazz */) { - return vibrator_exists() > 0 ? JNI_TRUE : JNI_FALSE; + if (gVibraModule && gVibraDevice) { + return JNI_TRUE; + } else { + return JNI_FALSE; + } } static void vibratorOn(JNIEnv* /* env */, jobject /* clazz */, jlong timeout_ms) { - // ALOGI("vibratorOn\n"); - vibrator_on(timeout_ms); + if (gVibraDevice) { + int err = gVibraDevice->vibrator_on(gVibraDevice, timeout_ms); + if (err != 0) { + ALOGE("The hw module failed in vibrator_on: %s", strerror(-err)); + } + } else { + ALOGW("Tried to vibrate but there is no vibrator device."); + } } static void vibratorOff(JNIEnv* /* env */, jobject /* clazz */) { - // ALOGI("vibratorOff\n"); - vibrator_off(); + if (gVibraDevice) { + int err = gVibraDevice->vibrator_off(gVibraDevice); + if (err != 0) { + ALOGE("The hw module failed in vibrator_off(): %s", strerror(-err)); + } + } else { + ALOGW("Tried to stop vibrating but there is no vibrator device."); + } } static JNINativeMethod method_table[] = { { "vibratorExists", "()Z", (void*)vibratorExists }, + { "vibratorInit", "()V", (void*)vibratorInit }, { "vibratorOn", "(J)V", (void*)vibratorOn }, { "vibratorOff", "()V", (void*)vibratorOff } }; |