Merge "Adding new haptic pattern for ringing incoming calls." into oc-dr1-dev
diff --git a/src/com/android/server/telecom/Ringer.java b/src/com/android/server/telecom/Ringer.java
index d955227..36bb4ed 100644
--- a/src/com/android/server/telecom/Ringer.java
+++ b/src/com/android/server/telecom/Ringer.java
@@ -19,6 +19,7 @@
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.content.Context;
+import android.os.VibrationEffect;
 import android.telecom.Log;
 import android.media.AudioAttributes;
 import android.media.AudioManager;
@@ -33,20 +34,30 @@
  */
 @VisibleForTesting
 public class Ringer {
-    private static final long[] VIBRATION_PATTERN = new long[] {
-        0, // No delay before starting
-        1000, // How long to vibrate
-        1000, // How long to wait before vibrating again
-    };
+    VibrationEffect mVibrationEffect;
+
+    private static final long[] PULSE_PATTERN = {0,12,250,12,500, // priming  + interval
+            50,50,50,50,50,50,50,50,50,50,50,50,50,50, // ease-in
+            300, // Peak
+            1000}; // pause before repetition
+
+    private static final int[] PULSE_AMPLITUDE = {0,255,0,255,0, // priming  + interval
+            77,77,78,79,81,84,87,93,101,114,133,162,205,255, // ease-in (min amplitude = 30%)
+            255, // Peak
+            0}; // pause before repetition
+
+    /**
+     * Indicates that vibration should be repeated at element 5 in the {@link #PULSE_AMPLITUDE} and
+     * {@link #PULSE_PATTERN} arrays.  This means repetition will happen for the main ease-in/peak
+     * pattern, but the priming + interval part will not be repeated.
+     */
+    private static final int REPEAT_VIBRATION_AT = 5;
 
     private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder()
             .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
             .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
             .build();
 
-    /** Indicate that we want the pattern to repeat at the step which turns on vibration. */
-    private static final int VIBRATION_PATTERN_REPEAT = 1;
-
     /**
      * Used to keep ordering of unanswered incoming calls. There can easily exist multiple incoming
      * calls and explicit ordering is useful for maintaining the proper state of the ringer.
@@ -95,6 +106,9 @@
         mRingtonePlayer = asyncRingtonePlayer;
         mRingtoneFactory = ringtoneFactory;
         mInCallController = inCallController;
+
+        mVibrationEffect = VibrationEffect.createWaveform(PULSE_PATTERN, PULSE_AMPLITUDE,
+                REPEAT_VIBRATION_AT);
     }
 
     public boolean startRinging(Call foregroundCall, boolean isHfpDeviceAttached) {
@@ -151,8 +165,7 @@
 
         if (shouldVibrate(mContext, foregroundCall) && !mIsVibrating && shouldRingForContact) {
             mVibratingCall = foregroundCall;
-            mVibrator.vibrate(VIBRATION_PATTERN, VIBRATION_PATTERN_REPEAT,
-                    VIBRATION_ATTRIBUTES);
+            mVibrator.vibrate(mVibrationEffect, VIBRATION_ATTRIBUTES);
             mIsVibrating = true;
         } else if (mIsVibrating) {
             Log.addEvent(foregroundCall, LogUtils.Events.SKIP_VIBRATION, "already vibrating");