summaryrefslogtreecommitdiffstats
path: root/voip
diff options
context:
space:
mode:
Diffstat (limited to 'voip')
-rw-r--r--voip/java/android/net/sip/SipSession.java3
-rw-r--r--voip/java/com/android/server/sip/SipSessionGroup.java30
2 files changed, 32 insertions, 1 deletions
diff --git a/voip/java/android/net/sip/SipSession.java b/voip/java/android/net/sip/SipSession.java
index 5ba1626..e03cf9f 100644
--- a/voip/java/android/net/sip/SipSession.java
+++ b/voip/java/android/net/sip/SipSession.java
@@ -63,6 +63,9 @@ public final class SipSession {
/** When an OPTIONS request is sent. */
public static final int PINGING = 9;
+ /** When ending a call. @hide */
+ public static final int ENDING_CALL = 10;
+
/** Not defined. */
public static final int NOT_DEFINED = 101;
diff --git a/voip/java/com/android/server/sip/SipSessionGroup.java b/voip/java/com/android/server/sip/SipSessionGroup.java
index 48d9b17..3b3cbf3 100644
--- a/voip/java/com/android/server/sip/SipSessionGroup.java
+++ b/voip/java/com/android/server/sip/SipSessionGroup.java
@@ -98,6 +98,7 @@ class SipSessionGroup implements SipListener {
private static final String THREAD_POOL_SIZE = "1";
private static final int EXPIRY_TIME = 3600; // in seconds
private static final int CANCEL_CALL_TIMER = 3; // in seconds
+ private static final int END_CALL_TIMER = 3; // in seconds
private static final int KEEPALIVE_TIMEOUT = 3; // in seconds
private static final int INCALL_KEEPALIVE_INTERVAL = 10; // in seconds
private static final long WAKE_LOCK_HOLDING_TIME = 500; // in milliseconds
@@ -756,6 +757,9 @@ class SipSessionGroup implements SipListener {
case SipSession.State.IN_CALL:
processed = inCall(evt);
break;
+ case SipSession.State.ENDING_CALL:
+ processed = endingCall(evt);
+ break;
default:
processed = false;
}
@@ -1230,8 +1234,10 @@ class SipSessionGroup implements SipListener {
// OK retransmission is handled in SipStack
if (END_CALL == evt) {
// rfc3261#section-15.1.1
+ mState = SipSession.State.ENDING_CALL;
mSipHelper.sendBye(mDialog);
- endCallNormally();
+ mProxy.onCallEnded(this);
+ startSessionTimer(END_CALL_TIMER);
return true;
} else if (isRequestEvent(Request.INVITE, evt)) {
// got Re-INVITE
@@ -1260,6 +1266,28 @@ class SipSessionGroup implements SipListener {
return false;
}
+ private boolean endingCall(EventObject evt) throws SipException {
+ if (expectResponse(Request.BYE, evt)) {
+ ResponseEvent event = (ResponseEvent) evt;
+ Response response = event.getResponse();
+
+ int statusCode = response.getStatusCode();
+ switch (statusCode) {
+ case Response.UNAUTHORIZED:
+ case Response.PROXY_AUTHENTICATION_REQUIRED:
+ if (handleAuthentication(event)) {
+ return true;
+ } else {
+ // can't authenticate; pass through to end session
+ }
+ }
+ cancelSessionTimer();
+ reset();
+ return true;
+ }
+ return false;
+ }
+
// timeout in seconds
private void startSessionTimer(int timeout) {
if (timeout > 0) {