From 0ce82d08ab6322cef07cf5c0bdec012db47602b6 Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Thu, 1 Jul 2021 14:48:56 +0100 Subject: [PATCH] Update notification PWLE patterns for default and fallback Update patterns after UX redesign of notification PWLE vibrations. There are different ones to be used to replace default and fallback patterns, keeping duration similar. Fix: 186740660 Test: manual Change-Id: Ic6b13e0e43d0f8e35ed341d0362a4ac0c962fb12 --- .../server/notification/VibratorHelper.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/services/core/java/com/android/server/notification/VibratorHelper.java b/services/core/java/com/android/server/notification/VibratorHelper.java index f47aa487744a9..0a69aec76306d 100644 --- a/services/core/java/com/android/server/notification/VibratorHelper.java +++ b/services/core/java/com/android/server/notification/VibratorHelper.java @@ -39,6 +39,9 @@ public final class VibratorHelper { private static final long[] DEFAULT_VIBRATE_PATTERN = {0, 250, 250, 250}; private static final int VIBRATE_PATTERN_MAXLEN = 8 * 2 + 1; // up to eight bumps + private static final int CHIRP_LEVEL_DURATION_MILLIS = 100; + private static final int DEFAULT_CHIRP_RAMP_DURATION_MILLIS = 100; + private static final int FALLBACK_CHIRP_RAMP_DURATION_MILLIS = 50; private final Vibrator mVibrator; private final long[] mDefaultPattern; @@ -102,6 +105,9 @@ public final class VibratorHelper { * @param insistent {@code true} if the vibration should loop until it is cancelled. */ public VibrationEffect createFallbackVibration(boolean insistent) { + if (mVibrator.hasFrequencyControl()) { + return createChirpVibration(FALLBACK_CHIRP_RAMP_DURATION_MILLIS, insistent); + } return createWaveformVibration(mFallbackPattern, insistent); } @@ -111,9 +117,32 @@ public final class VibratorHelper { * @param insistent {@code true} if the vibration should loop until it is cancelled. */ public VibrationEffect createDefaultVibration(boolean insistent) { + if (mVibrator.hasFrequencyControl()) { + return createChirpVibration(DEFAULT_CHIRP_RAMP_DURATION_MILLIS, insistent); + } return createWaveformVibration(mDefaultPattern, insistent); } + private static VibrationEffect createChirpVibration(int rampDuration, boolean insistent) { + VibrationEffect.WaveformBuilder waveformBuilder = VibrationEffect.startWaveform() + .addStep(/* amplitude= */ 0, /* frequency= */ -0.85f, /* duration= */ 0) + .addRamp(/* amplitude= */ 1, /* frequency= */ -0.25f, rampDuration) + .addStep(/* amplitude= */ 1, /* frequency= */ -0.25f, CHIRP_LEVEL_DURATION_MILLIS) + .addRamp(/* amplitude= */ 0, /* frequency= */ -0.85f, rampDuration); + + if (insistent) { + return waveformBuilder + .addStep(/* amplitude= */ 0, CHIRP_LEVEL_DURATION_MILLIS) + .build(/* repeat= */ 0); + } + + VibrationEffect singleBeat = waveformBuilder.build(); + return VibrationEffect.startComposition() + .addEffect(singleBeat) + .addEffect(singleBeat, /* delay= */ CHIRP_LEVEL_DURATION_MILLIS) + .compose(); + } + private static long[] getLongArray(Resources resources, int resId, int maxLength, long[] def) { int[] ar = resources.getIntArray(resId); if (ar == null) {