diff options
| -rw-r--r-- | core/java/android/os/VibrationEffect.java | 13 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/os/VibrationEffectTest.java | 17 |
2 files changed, 26 insertions, 4 deletions
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index df3beb2c6ea7..0587610630a6 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -437,7 +437,11 @@ public abstract class VibrationEffect implements Parcelable { * @hide */ protected static int scale(int amplitude, float scaleFactor) { - return (int) (scale((float) amplitude / MAX_AMPLITUDE, scaleFactor) * MAX_AMPLITUDE); + if (amplitude == 0) { + return 0; + } + int scaled = (int) (scale((float) amplitude / MAX_AMPLITUDE, scaleFactor) * MAX_AMPLITUDE); + return MathUtils.constrain(scaled, 1, MAX_AMPLITUDE); } /** @@ -473,7 +477,7 @@ public abstract class VibrationEffect implements Parcelable { float a = (expMaxX + 1f) / (expMaxX - 1f); float fx = (expX - 1f) / (expX + 1f); - return a * fx; + return MathUtils.constrain(a * fx, 0f, 1f); } /** @hide */ @@ -536,9 +540,10 @@ public abstract class VibrationEffect implements Parcelable { /** @hide */ @Override public OneShot resolve(int defaultAmplitude) { - if (defaultAmplitude > MAX_AMPLITUDE || defaultAmplitude < 0) { + if (defaultAmplitude > MAX_AMPLITUDE || defaultAmplitude <= 0) { throw new IllegalArgumentException( - "Amplitude is negative or greater than MAX_AMPLITUDE"); + "amplitude must be between 1 and 255 inclusive (amplitude=" + + defaultAmplitude + ")"); } if (mAmplitude == DEFAULT_AMPLITUDE) { return new OneShot(mDuration, defaultAmplitude); diff --git a/core/tests/coretests/src/android/os/VibrationEffectTest.java b/core/tests/coretests/src/android/os/VibrationEffectTest.java index 1d56e179317f..d555cd90d907 100644 --- a/core/tests/coretests/src/android/os/VibrationEffectTest.java +++ b/core/tests/coretests/src/android/os/VibrationEffectTest.java @@ -220,6 +220,10 @@ public class VibrationEffectTest { restored = scaledDown.scale(1.25f); // Does not restore to the exact original value because scale up is a bit offset. assertEquals(101, restored.getAmplitude(), AMPLITUDE_SCALE_TOLERANCE); + + // Does not go below min amplitude while scaling down. + VibrationEffect.OneShot minAmplitude = new VibrationEffect.OneShot(TEST_TIMING, 1); + assertEquals(1, minAmplitude.scale(0.5f).getAmplitude()); } @Test @@ -245,6 +249,15 @@ public class VibrationEffectTest { } @Test + public void testResolveOneshotFailsWhenAmplitudeNonPositive() { + try { + TEST_ONE_SHOT.resolve(0); + fail("Amplitude is set to zero, should throw IllegalArgumentException"); + } catch (IllegalArgumentException expected) { + } + } + + @Test public void testScaleWaveform() { VibrationEffect.Waveform initial = (VibrationEffect.Waveform) TEST_WAVEFORM; @@ -255,6 +268,10 @@ public class VibrationEffectTest { assertEquals(216, scaled.getAmplitudes()[0], AMPLITUDE_SCALE_TOLERANCE); assertEquals(0, scaled.getAmplitudes()[1]); assertEquals(-1, scaled.getAmplitudes()[2]); + + VibrationEffect.Waveform minAmplitude = new VibrationEffect.Waveform( + new long[]{100}, new int[] {1}, -1); + assertArrayEquals(new int[]{1}, minAmplitude.scale(0.5f).getAmplitudes()); } @Test |