summaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
authorHung-ying Tyan <tyanh@google.com>2011-06-27 19:20:48 +0800
committerHung-ying Tyan <tyanh@google.com>2011-06-27 19:33:24 +0800
commit0f8ceff66069c98480481241ba9d70dc34448188 (patch)
tree5982bf35ae565aa7b715a35a46a5b9f4e4d0309b /java
parent22ecc3df834674605daf86f7edf20169b6ca800b (diff)
downloadandroid_frameworks_opt_net_voip-0f8ceff66069c98480481241ba9d70dc34448188.tar.gz
android_frameworks_opt_net_voip-0f8ceff66069c98480481241ba9d70dc34448188.tar.bz2
android_frameworks_opt_net_voip-0f8ceff66069c98480481241ba9d70dc34448188.zip
Start keepalive process for the caller of a SIP call
so that the callee can send signals (on-hold or bye) back to the caller. Without the keepalive, the NAT port for the caller will be timed out during the call. And the signals will be dropped by the NAT device. Change-Id: I21848d73469045b2ed9e7281556ab184c594c362
Diffstat (limited to 'java')
-rw-r--r--java/com/android/server/sip/SipSessionGroup.java30
1 files changed, 27 insertions, 3 deletions
diff --git a/java/com/android/server/sip/SipSessionGroup.java b/java/com/android/server/sip/SipSessionGroup.java
index 481e306..6304369 100644
--- a/java/com/android/server/sip/SipSessionGroup.java
+++ b/java/com/android/server/sip/SipSessionGroup.java
@@ -93,6 +93,7 @@ class SipSessionGroup implements SipListener {
private static final int EXPIRY_TIME = 3600; // in seconds
private static final int CANCEL_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
private static final EventObject DEREGISTER = new EventObject("Deregister");
@@ -477,6 +478,8 @@ class SipSessionGroup implements SipListener {
private KeepAliveProcess mKeepAliveProcess;
+ private SipSessionImpl mKeepAliveSession;
+
// lightweight timer
class SessionTimer {
private boolean mRunning = true;
@@ -545,6 +548,11 @@ class SipSessionGroup implements SipListener {
mClientTransaction = null;
cancelSessionTimer();
+
+ if (mKeepAliveSession != null) {
+ mKeepAliveSession.stopKeepAliveProcess();
+ mKeepAliveSession = null;
+ }
}
public boolean isInCall() {
@@ -999,7 +1007,7 @@ class SipSessionGroup implements SipListener {
throws SipException {
// expect ACK, CANCEL request
if (isRequestEvent(Request.ACK, evt)) {
- establishCall();
+ establishCall(false);
return true;
} else if (isRequestEvent(Request.CANCEL, evt)) {
// http://tools.ietf.org/html/rfc3261#section-9.2
@@ -1031,7 +1039,7 @@ class SipSessionGroup implements SipListener {
case Response.OK:
mSipHelper.sendInviteAck(event, mDialog);
mPeerSessionDescription = extractContent(response);
- establishCall();
+ establishCall(true);
return true;
case Response.UNAUTHORIZED:
case Response.PROXY_AUTHENTICATION_REQUIRED:
@@ -1163,10 +1171,26 @@ class SipSessionGroup implements SipListener {
response.getStatusCode());
}
- private void establishCall() {
+ private void enableKeepAlive() {
+ if (mKeepAliveSession != null) {
+ mKeepAliveSession.stopKeepAliveProcess();
+ } else {
+ mKeepAliveSession = duplicate();
+ }
+ try {
+ mKeepAliveSession.startKeepAliveProcess(
+ INCALL_KEEPALIVE_INTERVAL, mPeerProfile, null);
+ } catch (SipException e) {
+ Log.w(TAG, "keepalive cannot be enabled; ignored", e);
+ mKeepAliveSession.stopKeepAliveProcess();
+ }
+ }
+
+ private void establishCall(boolean enableKeepAlive) {
mState = SipSession.State.IN_CALL;
mInCall = true;
cancelSessionTimer();
+ if (enableKeepAlive) enableKeepAlive();
mProxy.onCallEstablished(this, mPeerSessionDescription);
}