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

Commit 58c4631c authored by Michael Wright's avatar Michael Wright
Browse files

Ignore non-repeating vibrations in favor of repeating vibrations.

This way we don't inadvertently cancel things like alarms and ring
tone vibrations in favor of one shot vibrations, which are typically
shorter and meant to be feedback rather than attention getting.

Test: start alarm, hit home button, see alarm vibration isn't cancelled.
Bug: 65621937
Change-Id: Ib7fcaea7bc7f101d738b72112c8d5096c4b34ca2
parent 942aaf5a
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -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();