diff options
-rwxr-xr-x | telephony/java/com/android/internal/telephony/sip/SipPhone.java | 4 | ||||
-rw-r--r-- | voip/java/android/net/sip/SipAudioCall.java | 7 | ||||
-rw-r--r-- | voip/java/android/net/sip/SipAudioCallImpl.java | 69 |
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); |