Merge "Update CallId for handoff call" into master-nova
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 142fe6d..86641ee 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -27,7 +27,8 @@
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
- <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>
+ <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+ <uses-permission android:name="android.permission.VIBRATE" />
<!-- Declare which SDK level this application was built against. This is needed so that IDEs
can check for incompatible APIs. -->
diff --git a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
index 40ee0eb..324c25e 100644
--- a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
+++ b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
@@ -100,7 +100,7 @@
@Override
public void onReceive(Context context, Intent intent) {
- Log.v(this, "doReceive: %s");
+ Log.v(this, "onReceive: %s", intent);
// Once the NEW_OUTGOING_CALL broadcast is finished, the resultData is used as the
// actual number to call. (If null, no call will be placed.)
diff --git a/src/com/android/telecomm/Ringer.java b/src/com/android/telecomm/Ringer.java
index bb32cc3..fdc9349 100644
--- a/src/com/android/telecomm/Ringer.java
+++ b/src/com/android/telecomm/Ringer.java
@@ -18,6 +18,9 @@
import android.content.Context;
import android.media.AudioManager;
+import android.os.SystemVibrator;
+import android.os.Vibrator;
+import android.provider.Settings;
import android.telecomm.CallState;
import com.google.common.collect.Lists;
@@ -28,6 +31,15 @@
* Controls the ringtone player.
*/
final class Ringer extends CallsManagerListenerBase {
+ 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
+ };
+
+ /** Indicate that we want the pattern to repeat at the step which turns on vibration. */
+ private static final int VIBRATION_PATTERN_REPEAT = 1;
+
private final AsyncRingtonePlayer mRingtonePlayer = new AsyncRingtonePlayer();
/**
@@ -38,8 +50,19 @@
private final CallAudioManager mCallAudioManager;
+ private final Vibrator mVibrator;
+
+ /**
+ * Used to track the status of {@link #mVibrator} in the case of simultaneous incoming calls.
+ */
+ private boolean mIsVibrating = false;
+
Ringer(CallAudioManager callAudioManager) {
mCallAudioManager = callAudioManager;
+
+ // We don't rely on getSystemService(Context.VIBRATOR_SERVICE) to make sure this
+ // vibrator object will be isolated from others.
+ mVibrator = new SystemVibrator(TelecommApp.getInstance());
}
@Override
@@ -111,6 +134,12 @@
} else {
Log.v(this, "startRinging, skipping because volume is 0");
}
+
+ if (shouldVibrate(TelecommApp.getInstance()) && !mIsVibrating) {
+ mVibrator.vibrate(VIBRATION_PATTERN, VIBRATION_PATTERN_REPEAT,
+ AudioManager.STREAM_RING);
+ mIsVibrating = true;
+ }
}
private void stopRinging() {
@@ -119,5 +148,28 @@
// Even though stop is asynchronous it's ok to update the audio manager. Things like audio
// focus are voluntary so releasing focus too early is not detrimental.
mCallAudioManager.setIsRinging(false);
+
+ if (mIsVibrating) {
+ mVibrator.cancel();
+ mIsVibrating = false;
+ }
+ }
+
+ private boolean shouldVibrate(Context context) {
+ AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ int ringerMode = audioManager.getRingerMode();
+ if (getVibrateWhenRinging(context)) {
+ return ringerMode != AudioManager.RINGER_MODE_SILENT;
+ } else {
+ return ringerMode == AudioManager.RINGER_MODE_VIBRATE;
+ }
+ }
+
+ private boolean getVibrateWhenRinging(Context context) {
+ if (!mVibrator.hasVibrator()) {
+ return false;
+ }
+ return Settings.System.getInt(context.getContentResolver(),
+ Settings.System.VIBRATE_WHEN_RINGING, 0) != 0;
}
}