Merge "Vibra: Add loading of the vibrator hardware module." am: 5603eca33c
am: 358ad4980f
* commit '358ad4980fd6ea0ed22e81b3816572ec9ba39f53':
Vibra: Add loading of the vibrator hardware module.
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index c228422..9eb66dd 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -88,6 +88,7 @@
private SettingsObserver mSettingObserver;
native static boolean vibratorExists();
+ native static void vibratorInit();
native static void vibratorOn(long milliseconds);
native static void vibratorOff();
@@ -195,6 +196,7 @@
}
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 64278ed..03fbd19 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 const JNINativeMethod method_table[] = {
{ "vibratorExists", "()Z", (void*)vibratorExists },
+ { "vibratorInit", "()V", (void*)vibratorInit },
{ "vibratorOn", "(J)V", (void*)vibratorOn },
{ "vibratorOff", "()V", (void*)vibratorOff }
};