diff options
Diffstat (limited to 'com/android/server/VibratorService.java')
-rw-r--r-- | com/android/server/VibratorService.java | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/com/android/server/VibratorService.java b/com/android/server/VibratorService.java index 046eb761..8b79b9dd 100644 --- a/com/android/server/VibratorService.java +++ b/com/android/server/VibratorService.java @@ -373,12 +373,24 @@ public class VibratorService extends IVibratorService.Stub if (mCurrentVibration.hasLongerTimeout(newOneShot.getTiming()) && newOneShot.getAmplitude() == currentOneShot.getAmplitude()) { if (DEBUG) { - Slog.e(TAG, "Ignoring incoming vibration in favor of current vibration"); + Slog.d(TAG, "Ignoring incoming vibration in favor of current vibration"); } return; } } + // If the current vibration is repeating and the incoming one is non-repeating, then ignore + // the non-repeating vibration. This is so that we don't cancel vibrations that are meant + // to grab the attention of the user, like ringtones and alarms, in favor of one-shot + // vibrations that are likely quite short. + if (!isRepeatingVibration(effect) + && mCurrentVibration != null && isRepeatingVibration(mCurrentVibration.mEffect)) { + if (DEBUG) { + Slog.d(TAG, "Ignoring incoming vibration in favor of alarm vibration"); + } + return; + } + Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg); // Only link against waveforms since they potentially don't have a finish if @@ -404,6 +416,16 @@ public class VibratorService extends IVibratorService.Stub } } + private static boolean isRepeatingVibration(VibrationEffect effect) { + if (effect instanceof VibrationEffect.Waveform) { + final VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) effect; + if (waveform.getRepeatIndex() >= 0) { + return true; + } + } + return false; + } + private void addToPreviousVibrationsLocked(Vibration vib) { if (mPreviousVibrations.size() > mPreviousVibrationsLimit) { mPreviousVibrations.removeFirst(); |