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

Commit cc7dd574 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Default vibration amplitude resolution added"

parents 0aa6b397 55bdc59c
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");