diff options
| author | 2022-02-28 17:06:32 +0000 | |
|---|---|---|
| committer | 2022-03-01 10:39:52 +0000 | |
| commit | 9721eda98463d7eef26224ad53eab955effc67d4 (patch) | |
| tree | 1b7097a32b5d556984684b473ccec8737fa62577 | |
| parent | 5960382afe4c45adb6c09e7f46272e314be19770 (diff) | |
Fix vibration effect segment validation regression on allocation count
Change validation of user input parameters to create a VibrationEffect
to avoid build the error message string unless the validation fails, do
fix regression on allocation count perf metric.
Fix: 215985428
Test: fixed regression on metric
Change-Id: Ibbcfd450f0b25b88e071f3781952f24a72473575
4 files changed, 43 insertions, 14 deletions
diff --git a/core/java/android/os/vibrator/PrimitiveSegment.java b/core/java/android/os/vibrator/PrimitiveSegment.java index 58ca97860737..2d287e96ef60 100644 --- a/core/java/android/os/vibrator/PrimitiveSegment.java +++ b/core/java/android/os/vibrator/PrimitiveSegment.java @@ -108,7 +108,7 @@ public final class PrimitiveSegment extends VibrationEffectSegment { Preconditions.checkArgumentInRange(mPrimitiveId, VibrationEffect.Composition.PRIMITIVE_NOOP, VibrationEffect.Composition.PRIMITIVE_LOW_TICK, "primitiveId"); Preconditions.checkArgumentInRange(mScale, 0f, 1f, "scale"); - Preconditions.checkArgumentNonnegative(mDelay, "primitive delay should be >= 0"); + VibrationEffectSegment.checkDurationArgument(mDelay, "delay"); } @Override diff --git a/core/java/android/os/vibrator/RampSegment.java b/core/java/android/os/vibrator/RampSegment.java index 9e1f6360b090..d7d8c49fe28c 100644 --- a/core/java/android/os/vibrator/RampSegment.java +++ b/core/java/android/os/vibrator/RampSegment.java @@ -108,14 +108,9 @@ public final class RampSegment extends VibrationEffectSegment { /** @hide */ @Override public void validate() { - Preconditions.checkArgumentNonNegative(mStartFrequencyHz, - "Frequencies must all be >= 0, got start frequency of " + mStartFrequencyHz); - Preconditions.checkArgumentFinite(mStartFrequencyHz, "startFrequencyHz"); - Preconditions.checkArgumentNonNegative(mEndFrequencyHz, - "Frequencies must all be >= 0, got end frequency of " + mEndFrequencyHz); - Preconditions.checkArgumentFinite(mEndFrequencyHz, "endFrequencyHz"); - Preconditions.checkArgumentNonnegative(mDuration, - "Durations must all be >= 0, got " + mDuration); + VibrationEffectSegment.checkFrequencyArgument(mStartFrequencyHz, "startFrequencyHz"); + VibrationEffectSegment.checkFrequencyArgument(mEndFrequencyHz, "endFrequencyHz"); + VibrationEffectSegment.checkDurationArgument(mDuration, "duration"); Preconditions.checkArgumentInRange(mStartAmplitude, 0f, 1f, "startAmplitude"); Preconditions.checkArgumentInRange(mEndAmplitude, 0f, 1f, "endAmplitude"); } diff --git a/core/java/android/os/vibrator/StepSegment.java b/core/java/android/os/vibrator/StepSegment.java index c6795111d496..5a0bbf7d9436 100644 --- a/core/java/android/os/vibrator/StepSegment.java +++ b/core/java/android/os/vibrator/StepSegment.java @@ -95,11 +95,8 @@ public final class StepSegment extends VibrationEffectSegment { /** @hide */ @Override public void validate() { - Preconditions.checkArgumentNonNegative(mFrequencyHz, - "Frequencies must all be >= 0, got " + mFrequencyHz); - Preconditions.checkArgumentFinite(mFrequencyHz, "frequencyHz"); - Preconditions.checkArgumentNonnegative(mDuration, - "Durations must all be >= 0, got " + mDuration); + VibrationEffectSegment.checkFrequencyArgument(mFrequencyHz, "frequencyHz"); + VibrationEffectSegment.checkDurationArgument(mDuration, "duration"); if (Float.compare(mAmplitude, VibrationEffect.DEFAULT_AMPLITUDE) != 0) { Preconditions.checkArgumentInRange(mAmplitude, 0f, 1f, "amplitude"); } diff --git a/core/java/android/os/vibrator/VibrationEffectSegment.java b/core/java/android/os/vibrator/VibrationEffectSegment.java index 979c4472eb9b..be1055362f1c 100644 --- a/core/java/android/os/vibrator/VibrationEffectSegment.java +++ b/core/java/android/os/vibrator/VibrationEffectSegment.java @@ -112,6 +112,43 @@ public abstract class VibrationEffectSegment implements Parcelable { @NonNull public abstract <T extends VibrationEffectSegment> T applyEffectStrength(int effectStrength); + /** + * Checks the given frequency argument is valid to represent a vibration effect frequency in + * hertz, i.e. a finite non-negative value. + * + * @param value the frequency argument value to be checked + * @param name the argument name for the error message. + * + * @hide + */ + public static void checkFrequencyArgument(float value, @NonNull String name) { + // Similar to combining Preconditions checkArgumentFinite + checkArgumentNonnegative, + // but this implementation doesn't create the error message unless a check fail. + if (Float.isNaN(value)) { + throw new IllegalArgumentException(name + " must not be NaN"); + } + if (Float.isInfinite(value)) { + throw new IllegalArgumentException(name + " must not be infinite"); + } + if (value < 0) { + throw new IllegalArgumentException(name + " must be >= 0, got " + value); + } + } + + /** + * Checks the given duration argument is valid, i.e. a non-negative value. + * + * @param value the duration value to be checked + * @param name the argument name for the error message. + * + * @hide + */ + public static void checkDurationArgument(long value, @NonNull String name) { + if (value < 0) { + throw new IllegalArgumentException(name + " must be >= 0, got " + value); + } + } + @NonNull public static final Creator<VibrationEffectSegment> CREATOR = new Creator<VibrationEffectSegment>() { |