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

Commit 55bdc59c authored by Alexey Kuzmin's avatar Alexey Kuzmin
Browse files

Default vibration amplitude resolution added

Test: On sailfish, set vibration intensity to High, lock the phone and
unlock with FPS. Vibration should be played.
Bug: 76129874

Change-Id: I546341e55fa0e6de0af1d22c8e8e07d67670f0b9
Merged-In: I546341e55fa0e6de0af1d22c8e8e07d67670f0b9
parent 3b9eaab0
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
@@ -359,6 +359,26 @@ public abstract class VibrationEffect implements Parcelable {
            return new OneShot(mDuration, newAmplitude);
        }

        /**
         * Resolve default values into integer amplitude numbers.
         *
         * @param defaultAmplitude the default amplitude to apply, must be between 0 and
         *         MAX_AMPLITUDE
         * @return A {@link OneShot} effect with same physical meaning but explicitly set amplitude
         *
         * @hide
         */
        public OneShot resolve(int defaultAmplitude) {
            if (defaultAmplitude > MAX_AMPLITUDE || defaultAmplitude < 0) {
                throw new IllegalArgumentException(
                        "Amplitude is negative or greater than MAX_AMPLITUDE");
            }
            if (mAmplitude == DEFAULT_AMPLITUDE) {
                return new OneShot(mDuration, defaultAmplitude);
            }
            return this;
        }

        @Override
        public void validate() {
            if (mAmplitude < -1 || mAmplitude == 0 || mAmplitude > 255) {
@@ -487,6 +507,30 @@ public abstract class VibrationEffect implements Parcelable {
            return new Waveform(mTimings, scaledAmplitudes, mRepeat);
        }

        /**
         * Resolve default values into integer amplitude numbers.
         *
         * @param defaultAmplitude the default amplitude to apply, must be between 0 and
         *         MAX_AMPLITUDE
         * @return A {@link Waveform} effect with same physical meaning but explicitly set
         *         amplitude
         *
         * @hide
         */
        public Waveform resolve(int defaultAmplitude) {
            if (defaultAmplitude > MAX_AMPLITUDE || defaultAmplitude < 0) {
                throw new IllegalArgumentException(
                        "Amplitude is negative or greater than MAX_AMPLITUDE");
            }
            int[] resolvedAmplitudes = Arrays.copyOf(mAmplitudes, mAmplitudes.length);
            for (int i = 0; i < resolvedAmplitudes.length; i++) {
                if (resolvedAmplitudes[i] == DEFAULT_AMPLITUDE) {
                    resolvedAmplitudes[i] = defaultAmplitude;
                }
            }
            return new Waveform(mTimings, resolvedAmplitudes, mRepeat);
        }

        @Override
        public void validate() {
            if (mTimings.length != mAmplitudes.length) {
+36 −0
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ public class VibrationEffectTest {

    private static final VibrationEffect TEST_ONE_SHOT =
            VibrationEffect.createOneShot(TEST_TIMING, TEST_AMPLITUDE);
    private static final VibrationEffect DEFAULT_ONE_SHOT =
            VibrationEffect.createOneShot(TEST_TIMING, VibrationEffect.DEFAULT_AMPLITUDE);
    private static final VibrationEffect TEST_WAVEFORM =
            VibrationEffect.createWaveform(TEST_TIMINGS, TEST_AMPLITUDES, -1);

@@ -103,6 +105,22 @@ public class VibrationEffectTest {
        }
    }

    @Test
    public void testResolveOneShot() {
        VibrationEffect.OneShot initial = (VibrationEffect.OneShot) DEFAULT_ONE_SHOT;
        VibrationEffect.OneShot resolved = initial.resolve(239);
        assertEquals(239, resolved.getAmplitude());
    }

    @Test
    public void testResolveOneShotFailsWhenMaxAmplitudeAboveThreshold() {
        try {
            ((VibrationEffect.OneShot) TEST_ONE_SHOT).resolve(1000);
            fail("Max amplitude above threshold, should throw IllegalArgumentException");
        } catch (IllegalArgumentException expected) {
        }
    }

    @Test
    public void testScaleWaveform() {
        VibrationEffect.Waveform scaled =
@@ -120,6 +138,24 @@ public class VibrationEffectTest {
        }
    }

    @Test
    public void testResolveWaveform() {
        VibrationEffect.Waveform resolved =
                ((VibrationEffect.Waveform) TEST_WAVEFORM).resolve(239);
        assertEquals(255, resolved.getAmplitudes()[0]);
        assertEquals(0, resolved.getAmplitudes()[1]);
        assertEquals(239, resolved.getAmplitudes()[2]);
    }

    @Test
    public void testResolveWaveformFailsWhenMaxAmplitudeAboveThreshold() {
        try {
            ((VibrationEffect.Waveform) TEST_WAVEFORM).resolve(1000);
            fail("Max amplitude above threshold, should throw IllegalArgumentException");
        } catch (IllegalArgumentException expected) {
        }
    }


    private Resources mockRingtoneResources() {
        return mockRingtoneResources(new String[] {
+2 −0
Original line number Diff line number Diff line
@@ -704,9 +704,11 @@ public class VibratorService extends IVibratorService.Stub
        VibrationEffect scaledEffect = null;
        if (vib.effect instanceof VibrationEffect.OneShot) {
            VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) vib.effect;
            oneShot = oneShot.resolve(mDefaultVibrationAmplitude);
            scaledEffect = oneShot.scale(gamma, maxAmplitude);
        } else if (vib.effect instanceof VibrationEffect.Waveform) {
            VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) vib.effect;
            waveform = waveform.resolve(mDefaultVibrationAmplitude);
            scaledEffect = waveform.scale(gamma, maxAmplitude);
        } else {
            Slog.w(TAG, "Unable to apply intensity scaling, unknown VibrationEffect type");