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

Commit e8b100c5 authored by Lais Andrade's avatar Lais Andrade
Browse files

Introduce HalVibrator interface

Make VibratorController implement new interface and replace all usages,
to allow future change of HAL client implementation behind this flag.

Bug: 421428555
Flag: android.os.vibrator.remove_hidl_support
Test: FrameworksVibratorServicesTests
Change-Id: I058b5b8a678bb55bf94733781c4592cf61fc20ee
parent d43822bc
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -906,6 +906,10 @@ public abstract class CombinedVibration implements Parcelable {
            for (int i = 0; i < mEffects.size(); i++) {
                CombinedVibration vibration = mEffects.get(i);
                CombinedVibration newVibration = vibration.adapt(adapter);
                if (newVibration == null) {
                    // The vibration effect contains unsupported segments and cannot be played.
                    return null;
                }
                combination.addNext(newVibration, mDelays.get(i));
                hasSameEffects &= vibration.equals(newVibration);
            }
+3 −3
Original line number Diff line number Diff line
@@ -1254,8 +1254,8 @@ Lcom/android/server/utils/WatchedSparseBooleanMatrix;
Lcom/android/server/utils/WatchedSparseIntArray;
Lcom/android/server/utils/WatchedSparseSetArray;
Lcom/android/server/utils/Watcher;
Lcom/android/server/vibrator/HalVibrator$Callbacks;
Lcom/android/server/vibrator/VibratorController$NativeWrapper;
Lcom/android/server/vibrator/VibratorController$OnVibrationCompleteListener;
Lcom/android/server/vibrator/VibratorManagerService$VibratorManagerNativeCallbacks;
Lcom/android/server/vibrator/VibratorManagerService;
Lcom/android/server/wm/AbsAppSnapshotController;
@@ -19822,14 +19822,14 @@ PLcom/android/server/vibrator/VibratorController$$ExternalSyntheticLambda0;-><in
PLcom/android/server/vibrator/VibratorController$NativeWrapper;-><init>()V
PLcom/android/server/vibrator/VibratorController$NativeWrapper;->compose([Landroid/os/vibrator/PrimitiveSegment;J)J
PLcom/android/server/vibrator/VibratorController$NativeWrapper;->getInfo(Landroid/os/VibratorInfo$Builder;)Z
PLcom/android/server/vibrator/VibratorController$NativeWrapper;->init(ILcom/android/server/vibrator/VibratorController$OnVibrationCompleteListener;)V
PLcom/android/server/vibrator/VibratorController$NativeWrapper;->init(ILcom/android/server/vibrator/HalVibrator$Callbacks;)V
PLcom/android/server/vibrator/VibratorController$NativeWrapper;->off()V
PLcom/android/server/vibrator/VibratorController$NativeWrapper;->on(JJ)J
PLcom/android/server/vibrator/VibratorController$NativeWrapper;->perform(JJJ)J
PLcom/android/server/vibrator/VibratorController$NativeWrapper;->setAmplitude(F)V
PLcom/android/server/vibrator/VibratorController$NativeWrapper;->setExternalControl(Z)V
PLcom/android/server/vibrator/VibratorController$VibratorState;-><clinit>()V
PLcom/android/server/vibrator/VibratorController;-><init>(ILcom/android/server/vibrator/VibratorController$OnVibrationCompleteListener;Lcom/android/server/vibrator/VibratorController$NativeWrapper;)V
PLcom/android/server/vibrator/VibratorController;-><init>(ILcom/android/server/vibrator/HalVibrator$Callbacks;Lcom/android/server/vibrator/VibratorController$NativeWrapper;)V
PLcom/android/server/vibrator/VibratorController;->dump(Landroid/util/IndentingPrintWriter;)V
HPLcom/android/server/vibrator/VibratorController;->off()V
PLcom/android/server/vibrator/VibratorController;->on(Landroid/os/vibrator/PrebakedSegment;J)J
+5 −5
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ abstract class AbstractComposedVibratorStep extends AbstractVibratorStep {
    /**
     * @param conductor          The {@link VibrationStepConductor} for these steps.
     * @param startTime          The time to schedule this step in the conductor.
     * @param controller         The vibrator that is playing the effect.
     * @param vibrator           The vibrator that is playing the effect.
     * @param effect             The effect being played in this step.
     * @param index              The index of the next segment to be played by this step
     * @param pendingVibratorOffDeadline The time the vibrator is expected to complete any
@@ -42,9 +42,9 @@ abstract class AbstractComposedVibratorStep extends AbstractVibratorStep {
     *                           be used to play effects back-to-back.
     */
    AbstractComposedVibratorStep(VibrationStepConductor conductor, long startTime,
            VibratorController controller, VibrationEffect.Composed effect, int index,
            HalVibrator vibrator, VibrationEffect.Composed effect, int index,
            long pendingVibratorOffDeadline) {
        super(conductor, startTime, controller, pendingVibratorOffDeadline);
        super(conductor, startTime, vibrator, pendingVibratorOffDeadline);
        this.effect = effect;
        this.segmentIndex = index;
    }
@@ -116,7 +116,7 @@ abstract class AbstractComposedVibratorStep extends AbstractVibratorStep {
            getVibration().stats.reportRepetition(loopSegmentsPlayed / loopSize);
            nextSegmentIndex = repeatIndex + ((nextSegmentIndex - effectSize) % loopSize);
        }
        Step nextStep = conductor.nextVibrateStep(nextStartTime, controller, effect,
        Step nextStep = conductor.nextVibrateStep(nextStartTime, vibrator, effect,
                nextSegmentIndex, mPendingVibratorOffDeadline);
        return List.of(nextStep);
    }
@@ -124,6 +124,6 @@ abstract class AbstractComposedVibratorStep extends AbstractVibratorStep {
    /** Return next steps for cancelling the vibration playback. */
    protected List<Step> cancelStep() {
        return List.of(new CompleteEffectVibratorStep(conductor, SystemClock.uptimeMillis(),
                /* cancelled= */ true, controller, /* pendingVibratorOffDeadline= */ 0));
                /* cancelled= */ true, vibrator, /* pendingVibratorOffDeadline= */ 0));
    }
}
+9 −9
Original line number Diff line number Diff line
@@ -23,9 +23,9 @@ import android.util.Slog;
import java.util.Arrays;
import java.util.List;

/** Represent a step on a single vibrator that plays a command on {@link VibratorController}. */
/** Represent a step on a single vibrator that plays a command on {@link HalVibrator}. */
abstract class AbstractVibratorStep extends Step {
    public final VibratorController controller;
    public final HalVibrator vibrator;

    long mVibratorOnResult;
    long mPendingVibratorOffDeadline;
@@ -35,21 +35,21 @@ abstract class AbstractVibratorStep extends Step {
     * @param conductor          The VibrationStepConductor for these steps.
     * @param startTime          The time to schedule this step in the
     *                           {@link VibrationStepConductor}.
     * @param controller         The vibrator that is playing the effect.
     * @param vibrator           The vibrator that is playing the effect.
     * @param pendingVibratorOffDeadline The time the vibrator is expected to complete any
     *                           previous vibration and turn off. This is used to allow this step to
     *                           be triggered when the completion callback is received, and can
     *                           be used to play effects back-to-back.
     */
    AbstractVibratorStep(VibrationStepConductor conductor, long startTime,
            VibratorController controller, long pendingVibratorOffDeadline) {
            HalVibrator vibrator, long pendingVibratorOffDeadline) {
        super(conductor, startTime);
        this.controller = controller;
        this.vibrator = vibrator;
        mPendingVibratorOffDeadline = pendingVibratorOffDeadline;
    }

    public int getVibratorId() {
        return controller.getVibratorInfo().getId();
        return vibrator.getInfo().getId();
    }

    @Override
@@ -82,7 +82,7 @@ abstract class AbstractVibratorStep extends Step {
    @Override
    public List<Step> cancel() {
        return Arrays.asList(new CompleteEffectVibratorStep(conductor, SystemClock.uptimeMillis(),
                /* cancelled= */ true, controller, mPendingVibratorOffDeadline));
                /* cancelled= */ true, vibrator, mPendingVibratorOffDeadline));
    }

    @Override
@@ -126,7 +126,7 @@ abstract class AbstractVibratorStep extends Step {
        }
        // Make sure we ignore any pending callback from old vibration commands.
        conductor.nextVibratorCallbackStepId(getVibratorId());
        controller.off();
        vibrator.off();
        getVibration().stats.reportVibratorOff();
        mPendingVibratorOffDeadline = 0;
    }
@@ -136,7 +136,7 @@ abstract class AbstractVibratorStep extends Step {
            Slog.d(VibrationThread.TAG,
                    "Amplitude changed on vibrator " + getVibratorId() + " to " + amplitude);
        }
        controller.setAmplitude(amplitude);
        vibrator.setAmplitude(amplitude);
        getVibration().stats.reportSetAmplitude();
    }
}
+8 −8
Original line number Diff line number Diff line
@@ -35,8 +35,8 @@ final class CompleteEffectVibratorStep extends AbstractVibratorStep {
    private final boolean mCancelled;

    CompleteEffectVibratorStep(VibrationStepConductor conductor, long startTime, boolean cancelled,
            VibratorController controller, long pendingVibratorOffDeadline) {
        super(conductor, startTime, controller, pendingVibratorOffDeadline);
            HalVibrator vibrator, long pendingVibratorOffDeadline) {
        super(conductor, startTime, vibrator, pendingVibratorOffDeadline);
        mCancelled = cancelled;
    }

@@ -53,7 +53,7 @@ final class CompleteEffectVibratorStep extends AbstractVibratorStep {
        if (mCancelled) {
            // Double cancelling will just turn off the vibrator right away.
            return Arrays.asList(new TurnOffVibratorStep(conductor, SystemClock.uptimeMillis(),
                    controller, /* isCleanUp= */ true));
                    vibrator, /* isCleanUp= */ true));
        }
        return super.cancel();
    }
@@ -66,7 +66,7 @@ final class CompleteEffectVibratorStep extends AbstractVibratorStep {
            if (VibrationThread.DEBUG) {
                Slog.d(VibrationThread.TAG,
                        "Running " + (mCancelled ? "cancel" : "complete") + " vibration"
                                + " step on vibrator " + controller.getVibratorInfo().getId());
                                + " step on vibrator " + vibrator.getInfo().getId());
            }
            if (mVibratorCompleteCallbackReceived) {
                // Vibration completion callback was received by this step, just turn if off
@@ -76,7 +76,7 @@ final class CompleteEffectVibratorStep extends AbstractVibratorStep {
            }

            long now = SystemClock.uptimeMillis();
            float currentAmplitude = controller.getCurrentAmplitude();
            float currentAmplitude = vibrator.getCurrentAmplitude();
            long remainingOnDuration =
                    mPendingVibratorOffDeadline - now
                            - VibrationStepConductor.CALLBACKS_EXTRA_TIMEOUT;
@@ -95,13 +95,13 @@ final class CompleteEffectVibratorStep extends AbstractVibratorStep {
                    // Vibration is completing normally, turn off after the deadline in case we
                    // don't receive the callback in time (callback also triggers it right away).
                    return Arrays.asList(new TurnOffVibratorStep(conductor,
                            mPendingVibratorOffDeadline, controller, /* isCleanUp= */ false));
                            mPendingVibratorOffDeadline, vibrator, /* isCleanUp= */ false));
                }
            }

            if (VibrationThread.DEBUG) {
                Slog.d(VibrationThread.TAG,
                        "Ramping down vibrator " + controller.getVibratorInfo().getId()
                        "Ramping down vibrator " + vibrator.getInfo().getId()
                                + " from amplitude " + currentAmplitude
                                + " for " + rampDownDuration + "ms");
            }
@@ -116,7 +116,7 @@ final class CompleteEffectVibratorStep extends AbstractVibratorStep {
            float amplitudeTarget = currentAmplitude - amplitudeDelta;
            return Arrays.asList(
                    new RampOffVibratorStep(conductor, startTime, amplitudeTarget, amplitudeDelta,
                            controller, rampOffVibratorOffDeadline));
                            vibrator, rampOffVibratorOffDeadline));
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
        }
Loading