Merge "Update vendor VibrationEffect to support scale factor" into main
diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VendorEffect.aidl b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VendorEffect.aidl
index 1900084..62a7380 100644
--- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VendorEffect.aidl
+++ b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VendorEffect.aidl
@@ -37,4 +37,5 @@
android.os.PersistableBundle vendorData;
android.hardware.vibrator.EffectStrength strength = android.hardware.vibrator.EffectStrength.MEDIUM;
float scale;
+ float vendorScale;
}
diff --git a/vibrator/aidl/android/hardware/vibrator/VendorEffect.aidl b/vibrator/aidl/android/hardware/vibrator/VendorEffect.aidl
index 2155aca..6b1af53 100644
--- a/vibrator/aidl/android/hardware/vibrator/VendorEffect.aidl
+++ b/vibrator/aidl/android/hardware/vibrator/VendorEffect.aidl
@@ -36,16 +36,35 @@
/**
* The intensity of the haptic effect.
+ *
+ * This value is defined by discrete scale levels that represents the intensity of this haptic
+ * effect. This is a discrete representation of the scale parameter below.
*/
EffectStrength strength = EffectStrength.MEDIUM;
/**
- * A scale to be applied to the haptic effect intensity.
+ * The intensity of the haptic effect.
*
- * This value represents a linear scale that should be applied on top of the effect strength to
- * dynamically adapt to the device state.
+ * This value is defined by continuous scale that represents the intensity of this haptic
+ * effect. The vendor implementation can follow the platform scaling function or customize the
+ * implementation to their needs. This is a continuous representation of the strength parameter
+ * above.
*
* Values in [0,1) should scale down. Values > 1 should scale up within hardware bounds.
*/
float scale;
+
+ /**
+ * The dynamic scale parameter provided by the vendor vibrator controller.
+ *
+ * This value is the same provided by the vendor to the platform IVibratorControlService and
+ * should be applied on top of the effect intensity provided by the strength/scale fields.
+ * The vendor can use this to dynamically adapt the haptic effect intensity to the device state.
+ *
+ * See frameworks/hardware/interfaces/vibrator for more documentation on vendor vibrator
+ * controller, and ScaleParam for more about this scale parameter.
+ *
+ * Values in [0,1) should scale down. Values > 1 should scale up within hardware bounds.
+ */
+ float vendorScale;
}
diff --git a/vibrator/aidl/default/Vibrator.cpp b/vibrator/aidl/default/Vibrator.cpp
index acf7d34..29e7d18 100644
--- a/vibrator/aidl/default/Vibrator.cpp
+++ b/vibrator/aidl/default/Vibrator.cpp
@@ -117,6 +117,10 @@
if (scale <= 0) {
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
}
+ float vendorScale = effect.vendorScale;
+ if (vendorScale <= 0) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
+ }
int32_t durationMs = 0;
if (!effect.vendorData.getInt("DURATION_MS", &durationMs) || durationMs <= 0) {
diff --git a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp
index 706ab41..2502589 100644
--- a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp
+++ b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp
@@ -366,7 +366,8 @@
TEST_P(VibratorAidl, PerformVendorEffectSupported) {
if ((capabilities & IVibrator::CAP_PERFORM_VENDOR_EFFECTS) == 0) return;
- float scale = 0.5f;
+ float scale = 0.0f;
+ float vendorScale = 0.0f;
for (EffectStrength strength : kEffectStrengths) {
PersistableBundle vendorData;
::aidl::android::hardware::vibrator::testing::fillBasicData(&vendorData);
@@ -379,7 +380,9 @@
effect.vendorData = vendorData;
effect.strength = strength;
effect.scale = scale;
- scale *= 1.5f;
+ effect.vendorScale = vendorScale;
+ scale += 0.5f;
+ vendorScale += 0.2f;
auto callback = ndk::SharedRefBase::make<CompletionCallback>([] {});
ndk::ScopedAStatus status = vibrator->performVendorEffect(effect, callback);
@@ -408,6 +411,7 @@
for (EffectStrength strength : kEffectStrengths) {
float scale = 0.5f;
+ float vendorScale = 0.2f;
for (uint8_t i = 0; i < iterations; i++) {
PersistableBundle vendorData;
::aidl::android::hardware::vibrator::testing::fillRandomData(&vendorData);
@@ -416,7 +420,9 @@
effect.vendorData = vendorData;
effect.strength = strength;
effect.scale = scale;
+ effect.vendorScale = vendorScale;
scale *= 2;
+ vendorScale *= 1.5f;
auto callback = ndk::SharedRefBase::make<CompletionCallback>([] {});
ndk::ScopedAStatus status = vibrator->performVendorEffect(effect, callback);
@@ -444,6 +450,7 @@
VendorEffect effect;
effect.strength = strength;
effect.scale = 1.0f;
+ effect.vendorScale = 1.0f;
ndk::ScopedAStatus status = vibrator->performVendorEffect(effect, nullptr /*callback*/);
@@ -459,10 +466,12 @@
VendorEffect effect;
effect.strength = EffectStrength::MEDIUM;
- effect.scale = 0.0f;
+ effect.scale = -1.0f;
+ effect.vendorScale = 1.0f;
EXPECT_ILLEGAL_ARGUMENT(vibrator->performVendorEffect(effect, nullptr /*callback*/));
- effect.scale = -1.0f;
+ effect.scale = 1.0f;
+ effect.vendorScale = -1.0f;
EXPECT_ILLEGAL_ARGUMENT(vibrator->performVendorEffect(effect, nullptr /*callback*/));
}
@@ -473,6 +482,7 @@
VendorEffect effect;
effect.strength = strength;
effect.scale = 1.0f;
+ effect.vendorScale = 1.0f;
EXPECT_UNKNOWN_OR_UNSUPPORTED(vibrator->performVendorEffect(effect, nullptr /*callback*/))
<< "\n For vendor effect with strength " << toString(strength);