summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2014-11-26 07:31:05 +0100
committerSteve Kondik <steve@cyngn.com>2015-03-21 16:22:14 -0700
commit9a912380a06d9bd4d74b94eac88b3d116c7bdffb (patch)
tree0a47060b3852ad98fa38c74dabe96db9296ecdc7
parentce6d7803b8b2abbb768f3f10c832fdd3db8323ea (diff)
downloadpackages_apps_InCallUI-9a912380a06d9bd4d74b94eac88b3d116c7bdffb.tar.gz
packages_apps_InCallUI-9a912380a06d9bd4d74b94eac88b3d116c7bdffb.tar.bz2
packages_apps_InCallUI-9a912380a06d9bd4d74b94eac88b3d116c7bdffb.zip
Fix call tracking.
getActiveCall() can return null when ending calls locally before they are answered locally, so better use the presence of an active call as indicator of whether to do the vibration instead of using the state. Change-Id: I088cd743c9a9e6704e93f8c48fb566b3a20ca8be
-rw-r--r--src/com/android/incallui/Call.java8
-rw-r--r--src/com/android/incallui/InCallVibrationHandler.java65
2 files changed, 50 insertions, 23 deletions
diff --git a/src/com/android/incallui/Call.java b/src/com/android/incallui/Call.java
index 025c3b87..e8de77a2 100644
--- a/src/com/android/incallui/Call.java
+++ b/src/com/android/incallui/Call.java
@@ -247,6 +247,7 @@ public final class Call {
private final List<String> mChildCallIds = new ArrayList<>();
private final VideoSettings mVideoSettings = new VideoSettings();
private int mModifyToVideoState = VideoProfile.VideoState.AUDIO_ONLY;
+ private boolean mIsOutgoing = false;
private InCallVideoCallListener mVideoCallListener;
@@ -351,6 +352,13 @@ public final class Call {
public void setState(int state) {
mState = state;
+ if (state == State.DIALING || state == State.CONNECTING) {
+ mIsOutgoing = true;
+ }
+ }
+
+ public boolean isOutgoing() {
+ return mIsOutgoing;
}
public int getNumberPresentation() {
diff --git a/src/com/android/incallui/InCallVibrationHandler.java b/src/com/android/incallui/InCallVibrationHandler.java
index 517b0761..42845df7 100644
--- a/src/com/android/incallui/InCallVibrationHandler.java
+++ b/src/com/android/incallui/InCallVibrationHandler.java
@@ -22,6 +22,7 @@ import android.os.Handler;
import android.os.Message;
import android.os.Vibrator;
import android.preference.PreferenceManager;
+import android.telecom.DisconnectCause;
import com.android.incallui.InCallPresenter.InCallState;
@@ -55,33 +56,51 @@ public class InCallVibrationHandler extends Handler implements
@Override
public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
- Log.d(this, "onStateChange");
+ Call activeCall = callList.getActiveCall();
- if (oldState == newState) {
- return;
+ if (activeCall != null && mActiveCall == null) {
+ Log.d(this, "Transition to active call " + activeCall);
+ if (activeCall.isOutgoing()) {
+ handleOutgoingCallVibration(activeCall);
+ }
+ mActiveCall = activeCall;
+ } else if (activeCall == null && mActiveCall != null) {
+ Log.d(this, "Transition from active call " + mActiveCall);
+ handleCallEnd(mActiveCall);
+ mActiveCall = null;
}
+ }
- if (newState == InCallState.INCALL) {
- mActiveCall = callList.getActiveCall();
- if (oldState == InCallState.PENDING_OUTGOING || oldState == InCallState.OUTGOING) {
- long durationMillis = System.currentTimeMillis() - mActiveCall.getConnectTimeMillis();
- Log.d(this, "duration is " + durationMillis);
-
- if (mPrefs.getBoolean(KEY_VIBRATE_OUTGOING, false) && durationMillis < 200) {
- vibrate(100, 200, 0);
- }
- if (mPrefs.getBoolean(KEY_VIBRATE_45SECS, false)) {
- start45SecondVibration(durationMillis);
- }
- }
- } else if (mActiveCall != null && newState == InCallState.NO_CALLS) {
- long durationMillis = System.currentTimeMillis() - mActiveCall.getConnectTimeMillis();
- if (mPrefs.getBoolean(KEY_VIBRATE_HANGUP, false) && durationMillis > 500) {
- vibrate(50, 100, 50);
- }
- // Stop 45-second vibration
- removeMessages(MSG_VIBRATE_45_SEC);
+ private void handleOutgoingCallVibration(Call call) {
+ long durationMillis = System.currentTimeMillis() - call.getConnectTimeMillis();
+ Log.d(this, "Start outgoing call: duration = " + durationMillis);
+
+ if (mPrefs.getBoolean(KEY_VIBRATE_OUTGOING, false) && durationMillis < 200) {
+ vibrate(100, 200, 0);
}
+ if (mPrefs.getBoolean(KEY_VIBRATE_45SECS, false)) {
+ start45SecondVibration(durationMillis);
+ }
+ }
+
+ private void handleCallEnd(Call call) {
+ long durationMillis = System.currentTimeMillis() - call.getConnectTimeMillis();
+ DisconnectCause cause = call.getDisconnectCause();
+ boolean localDisconnect =
+ // Disconnection not yet processed
+ call.getState() == Call.State.DISCONNECTING ||
+ // Disconnection already processed
+ (cause != null && cause.getCode() == DisconnectCause.LOCAL);
+
+ Log.d(this, "Ending active call: duration = " + durationMillis
+ + ", locally disconnected = " + localDisconnect);
+
+ if (mPrefs.getBoolean(KEY_VIBRATE_HANGUP, false) &&
+ !localDisconnect && durationMillis > 500) {
+ vibrate(50, 100, 50);
+ }
+ // Stop 45-second vibration
+ removeMessages(MSG_VIBRATE_45_SEC);
}
private void start45SecondVibration(long callDurationMillis) {