summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xtelephony/java/com/android/internal/telephony/sip/SipPhone.java4
-rw-r--r--voip/java/android/net/sip/SipAudioCall.java7
-rw-r--r--voip/java/android/net/sip/SipAudioCallImpl.java69
3 files changed, 54 insertions, 26 deletions
diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhone.java b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
index f85096d..5d61a6e 100755
--- a/telephony/java/com/android/internal/telephony/sip/SipPhone.java
+++ b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
@@ -818,9 +818,9 @@ public class SipPhone extends SipPhoneBase {
}
@Override
- public void onError(SipAudioCall call, String errorCode,
+ public void onError(SipAudioCall call, SipErrorCode errorCode,
String errorMessage) {
- switch (Enum.valueOf(SipErrorCode.class, errorCode)) {
+ switch (errorCode) {
case INVALID_REMOTE_URI:
onError(Connection.DisconnectCause.INVALID_NUMBER);
break;
diff --git a/voip/java/android/net/sip/SipAudioCall.java b/voip/java/android/net/sip/SipAudioCall.java
index 39083a5..1d1be69 100644
--- a/voip/java/android/net/sip/SipAudioCall.java
+++ b/voip/java/android/net/sip/SipAudioCall.java
@@ -88,10 +88,11 @@ public interface SipAudioCall {
* Called when an error occurs.
*
* @param call the call object that carries out the audio call
- * @param errorCode error code defined in {@link SipErrorCode}
+ * @param errorCode error code of this error
* @param errorMessage error message
*/
- void onError(SipAudioCall call, String errorCode, String errorMessage);
+ void onError(SipAudioCall call, SipErrorCode errorCode,
+ String errorMessage);
}
/**
@@ -125,7 +126,7 @@ public interface SipAudioCall {
public void onCallHeld(SipAudioCall call) {
onChanged(call);
}
- public void onError(SipAudioCall call, String errorCode,
+ public void onError(SipAudioCall call, SipErrorCode errorCode,
String errorMessage) {
onChanged(call);
}
diff --git a/voip/java/android/net/sip/SipAudioCallImpl.java b/voip/java/android/net/sip/SipAudioCallImpl.java
index 1ae548f..71e0a8f 100644
--- a/voip/java/android/net/sip/SipAudioCallImpl.java
+++ b/voip/java/android/net/sip/SipAudioCallImpl.java
@@ -76,6 +76,9 @@ public class SipAudioCallImpl extends SipSessionAdapter
private SipProfile mPendingCallRequest;
+ private SipErrorCode mErrorCode;
+ private String mErrorMessage;
+
public SipAudioCallImpl(Context context, SipProfile localProfile) {
mContext = context;
mLocalProfile = localProfile;
@@ -88,23 +91,33 @@ public class SipAudioCallImpl extends SipSessionAdapter
public void setListener(SipAudioCall.Listener listener,
boolean callbackImmediately) {
mListener = listener;
- if ((listener == null) || !callbackImmediately) return;
try {
- SipSessionState state = getState();
- switch (state) {
- case READY_TO_CALL:
- listener.onReadyToCall(this);
- break;
- case INCOMING_CALL:
- listener.onRinging(this, getPeerProfile(mSipSession));
- startRinging();
- break;
- case OUTGOING_CALL:
- listener.onCalling(this);
- break;
- default:
- listener.onError(this, SipErrorCode.CLIENT_ERROR.toString(),
- "wrong state to attach call: " + state);
+ if ((listener == null) || !callbackImmediately) {
+ // do nothing
+ } else if (mErrorCode != null) {
+ listener.onError(this, mErrorCode, mErrorMessage);
+ } else if (mInCall) {
+ if (mHold) {
+ listener.onCallHeld(this);
+ } else {
+ listener.onCallEstablished(this);
+ }
+ } else {
+ SipSessionState state = getState();
+ switch (state) {
+ case READY_TO_CALL:
+ listener.onReadyToCall(this);
+ break;
+ case INCOMING_CALL:
+ listener.onRinging(this, getPeerProfile(mSipSession));
+ break;
+ case OUTGOING_CALL:
+ listener.onCalling(this);
+ break;
+ case OUTGOING_CALL_RING_BACK:
+ listener.onRingingBack(this);
+ break;
+ }
}
} catch (Throwable t) {
Log.e(TAG, "setListener()", t);
@@ -131,6 +144,8 @@ public class SipAudioCallImpl extends SipSessionAdapter
mInCall = false;
mHold = false;
mSessionId = -1L;
+ mErrorCode = null;
+ mErrorMessage = null;
}
public synchronized SipProfile getLocalProfile() {
@@ -270,14 +285,20 @@ public class SipAudioCallImpl extends SipSessionAdapter
}
}
+ private SipErrorCode getErrorCode(String errorCode) {
+ return Enum.valueOf(SipErrorCode.class, errorCode);
+ }
+
@Override
public void onCallChangeFailed(ISipSession session, String errorCode,
String message) {
Log.d(TAG, "sip call change failed: " + message);
+ mErrorCode = getErrorCode(errorCode);
+ mErrorMessage = message;
Listener listener = mListener;
if (listener != null) {
try {
- listener.onError(SipAudioCallImpl.this, errorCode, message);
+ listener.onError(SipAudioCallImpl.this, mErrorCode, message);
} catch (Throwable t) {
Log.e(TAG, "onCallBusy()", t);
}
@@ -285,16 +306,20 @@ public class SipAudioCallImpl extends SipSessionAdapter
}
@Override
- public void onError(ISipSession session, String errorCode,
- String message) {
+ public void onError(ISipSession session, String errorCode, String message) {
Log.d(TAG, "sip session error: " + errorCode + ": " + message);
+ mErrorCode = getErrorCode(errorCode);
+ mErrorMessage = message;
synchronized (this) {
- if (!isInCall()) close(true);
+ if ((mErrorCode == SipErrorCode.DATA_CONNECTION_LOST)
+ || !isInCall()) {
+ close(true);
+ }
}
Listener listener = mListener;
if (listener != null) {
try {
- listener.onError(SipAudioCallImpl.this, errorCode, message);
+ listener.onError(SipAudioCallImpl.this, mErrorCode, message);
} catch (Throwable t) {
Log.e(TAG, "onError()", t);
}
@@ -307,6 +332,8 @@ public class SipAudioCallImpl extends SipSessionAdapter
try {
mPeerSd = new SdpSessionDescription(sessionDescription);
session.setListener(this);
+
+ if (getState() == SipSessionState.INCOMING_CALL) startRinging();
} catch (Throwable e) {
Log.e(TAG, "attachCall()", e);
throwSipException(e);