Add support for vibrator 1.1 HAL and TICK effect.
New HAL support is a bit hacky but gets us unblocked.
Bug: 38417655
Bug: 38417570
Test: Manual (hacked up 1.1 HAL implementation that just logs)
Change-Id: I207cce97c81734bac1ca00a5de18e160d13e2bbe
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 03e9dd2..7ba3d7d 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -221,19 +221,24 @@
long[] clickEffectTimings = getLongIntArray(context.getResources(),
com.android.internal.R.array.config_virtualKeyVibePattern);
- VibrationEffect clickEffect;
- if (clickEffectTimings.length == 0) {
- clickEffect = null;
- } else if (clickEffectTimings.length == 1) {
- clickEffect = VibrationEffect.createOneShot(
- clickEffectTimings[0], VibrationEffect.DEFAULT_AMPLITUDE);
- } else {
- clickEffect = VibrationEffect.createWaveform(clickEffectTimings, -1);
- }
+ VibrationEffect clickEffect = createEffect(clickEffectTimings);
VibrationEffect doubleClickEffect = VibrationEffect.createWaveform(
new long[] {0, 30, 100, 30} /*timings*/, -1);
+ long[] tickEffectTimings = getLongIntArray(context.getResources(),
+ com.android.internal.R.array.config_clockTickVibePattern);
+ VibrationEffect tickEffect = createEffect(tickEffectTimings);
- mFallbackEffects = new VibrationEffect[] { clickEffect, doubleClickEffect };
+ mFallbackEffects = new VibrationEffect[] { clickEffect, doubleClickEffect, tickEffect };
+ }
+
+ private static VibrationEffect createEffect(long[] timings) {
+ if (timings == null || timings.length == 0) {
+ return null;
+ } else if (timings.length == 1) {
+ return VibrationEffect.createOneShot(timings[0], VibrationEffect.DEFAULT_AMPLITUDE);
+ } else {
+ return VibrationEffect.createWaveform(timings, -1);
+ }
}
public void systemReady() {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 76d5c33..2c9d6fe 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -429,15 +429,6 @@
// Vibrator pattern for haptic feedback of a long press.
long[] mLongPressVibePattern;
- // Vibrator pattern for haptic feedback of virtual key press.
- long[] mVirtualKeyVibePattern;
-
- // Vibrator pattern for a short vibration.
- long[] mKeyboardTapVibePattern;
-
- // Vibrator pattern for a short vibration when tapping on an hour/minute tick of a Clock.
- long[] mClockTickVibePattern;
-
// Vibrator pattern for a short vibration when tapping on a day/month/year date of a Calendar.
long[] mCalendarDateVibePattern;
@@ -447,9 +438,6 @@
// Vibrator pattern for haptic feedback during boot when safe mode is enabled.
long[] mSafeModeEnabledVibePattern;
- // Vibrator pattern for haptic feedback of a context click.
- long[] mContextClickVibePattern;
-
/** If true, hitting shift & menu will broadcast Intent.ACTION_BUG_REPORT */
boolean mEnableShiftMenuBugReports = false;
@@ -2052,20 +2040,12 @@
mVibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
mLongPressVibePattern = getLongIntArray(mContext.getResources(),
com.android.internal.R.array.config_longPressVibePattern);
- mVirtualKeyVibePattern = getLongIntArray(mContext.getResources(),
- com.android.internal.R.array.config_virtualKeyVibePattern);
- mKeyboardTapVibePattern = getLongIntArray(mContext.getResources(),
- com.android.internal.R.array.config_keyboardTapVibePattern);
- mClockTickVibePattern = getLongIntArray(mContext.getResources(),
- com.android.internal.R.array.config_clockTickVibePattern);
mCalendarDateVibePattern = getLongIntArray(mContext.getResources(),
com.android.internal.R.array.config_calendarDateVibePattern);
mSafeModeDisabledVibePattern = getLongIntArray(mContext.getResources(),
com.android.internal.R.array.config_safeModeDisabledVibePattern);
mSafeModeEnabledVibePattern = getLongIntArray(mContext.getResources(),
com.android.internal.R.array.config_safeModeEnabledVibePattern);
- mContextClickVibePattern = getLongIntArray(mContext.getResources(),
- com.android.internal.R.array.config_contextClickVibePattern);
mScreenshotChordEnabled = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_enableScreenshotChord);
@@ -7692,8 +7672,7 @@
case HapticFeedbackConstants.KEYBOARD_TAP:
return VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
case HapticFeedbackConstants.CLOCK_TICK:
- pattern = mClockTickVibePattern;
- break;
+ return VibrationEffect.get(VibrationEffect.EFFECT_TICK);
case HapticFeedbackConstants.CALENDAR_DATE:
pattern = mCalendarDateVibePattern;
break;
@@ -7704,8 +7683,7 @@
pattern = mSafeModeEnabledVibePattern;
break;
case HapticFeedbackConstants.CONTEXT_CLICK:
- pattern = mContextClickVibePattern;
- break;
+ return VibrationEffect.get(VibrationEffect.EFFECT_TICK);
default:
return null;
}
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index e6c2b1d..362dd9f 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -100,6 +100,7 @@
android.hardware.tv.cec@1.0 \
android.hardware.tv.input@1.0 \
android.hardware.vibrator@1.0 \
+ android.hardware.vibrator@1.1 \
android.hardware.vr@1.0 \
android.frameworks.schedulerservice@1.0 \
android.frameworks.sensorservice@1.0 \
diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp
index 76ce890..804cd17 100644
--- a/services/core/jni/com_android_server_VibratorService.cpp
+++ b/services/core/jni/com_android_server_VibratorService.cpp
@@ -18,6 +18,7 @@
#include <android/hardware/vibrator/1.0/IVibrator.h>
#include <android/hardware/vibrator/1.0/types.h>
+#include <android/hardware/vibrator/1.1/IVibrator.h>
#include "jni.h"
#include "JNIHelp.h"
@@ -35,6 +36,8 @@
using android::hardware::vibrator::V1_0::EffectStrength;
using android::hardware::vibrator::V1_0::IVibrator;
using android::hardware::vibrator::V1_0::Status;
+using android::hardware::vibrator::V1_1::Effect_1_1;
+using IVibrator_1_1 = android::hardware::vibrator::V1_1::IVibrator;
namespace android
{
@@ -108,11 +111,26 @@
if (mHal != nullptr) {
Status status;
uint32_t lengthMs;
- mHal->perform(static_cast<Effect>(effect), static_cast<EffectStrength>(strength),
- [&status, &lengthMs](Status retStatus, uint32_t retLengthMs) {
- status = retStatus;
- lengthMs = retLengthMs;
- });
+ auto callback = [&status, &lengthMs](Status retStatus, uint32_t retLengthMs) {
+ status = retStatus;
+ lengthMs = retLengthMs;
+ };
+ EffectStrength effectStrength(static_cast<EffectStrength>(strength));
+
+ if (effect < 0 || effect > static_cast<uint32_t>(Effect_1_1::TICK)) {
+ ALOGW("Unable to perform haptic effect, invalid effect ID (%" PRId32 ")",
+ static_cast<int32_t>(effect));
+ } else if (effect == static_cast<uint32_t>(Effect_1_1::TICK)) {
+ sp<IVibrator_1_1> hal_1_1 = IVibrator_1_1::castFrom(mHal);
+ if (hal_1_1 != nullptr) {
+ hal_1_1->perform_1_1(static_cast<Effect_1_1>(effect), effectStrength, callback);
+ } else {
+ ALOGW("Failed to perform effect (%" PRId32 "), insufficient HAL version",
+ static_cast<int32_t>(effect));
+ }
+ } else {
+ mHal->perform(static_cast<Effect>(effect), effectStrength, callback);
+ }
if (status == Status::OK) {
return lengthMs;
} else if (status != Status::UNSUPPORTED_OPERATION) {