Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4526faf7 authored by Lais Andrade's avatar Lais Andrade
Browse files

Update vendor VibrationEffect to support scale factor

Update VendorEffect.aidl to support 2 continuous float scale parameters,
one that reflects the user intensity settings for that effect and a
second that is forwarded from the vendor vibrator controller service for
that vibration usage.

This allows vendors to apply the 2-tier scaling function to the
vibrations, one reflecting the user settings and a second reflecting the
vendor parameter sent to the platform based on the device current
state.

Bug: 345409060
Test: VtsHalVibratorTargetTest
Flag: EXEMPT HAL interface changes
Change-Id: Ic88f90fd0ff1eae8797a7fe7d84d5b11f6c2f6bf
parent f02779e0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -37,4 +37,5 @@ parcelable VendorEffect {
  android.os.PersistableBundle vendorData;
  android.hardware.vibrator.EffectStrength strength = android.hardware.vibrator.EffectStrength.MEDIUM;
  float scale;
  float vendorScale;
}
+22 −3
Original line number Diff line number Diff line
@@ -36,16 +36,35 @@ parcelable VendorEffect {

    /**
     * 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;
}
+4 −0
Original line number Diff line number Diff line
@@ -117,6 +117,10 @@ ndk::ScopedAStatus Vibrator::performVendorEffect(
    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) {
+14 −4
Original line number Diff line number Diff line
@@ -366,7 +366,8 @@ TEST_P(VibratorAidl, InvalidEffectsUnsupported) {
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 @@ TEST_P(VibratorAidl, PerformVendorEffectSupported) {
        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 @@ TEST_P(VibratorAidl, PerformVendorEffectStability) {

    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 @@ TEST_P(VibratorAidl, PerformVendorEffectStability) {
            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 @@ TEST_P(VibratorAidl, PerformVendorEffectEmptyVendorData) {
        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 @@ TEST_P(VibratorAidl, PerformVendorEffectInvalidScale) {
    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 @@ TEST_P(VibratorAidl, PerformVendorEffectUnsupported) {
        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);