SIP: minor fixes.

+ Log error instead of crashing app process in SipManager's ListenerRelay.
+ Terminate dialog and transaction in SipSessionGroup.reset().
+ Remove redundant reset() in SipSessionGroup.

Change-Id: Ifbf29d2c9607ffe1a1a50b0c131ee3a4e81a0d0e
diff --git a/voip/java/android/net/sip/SipManager.java b/voip/java/android/net/sip/SipManager.java
index a589fe9..bd859e8 100644
--- a/voip/java/android/net/sip/SipManager.java
+++ b/voip/java/android/net/sip/SipManager.java
@@ -23,6 +23,7 @@
 import android.os.Looper;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.util.Log;
 
 import java.text.ParseException;
 
@@ -83,6 +84,8 @@
     /** Part of the incoming call intent. */
     public static final String EXTRA_OFFER_SD = "android:sipOfferSD";
 
+    private static final String TAG = "SipManager";
+
     private ISipService mSipService;
     private Context mContext;
 
@@ -525,8 +528,10 @@
                 return ((session == null)
                         ? mUri
                         : session.getLocalProfile().getUriString());
-            } catch (RemoteException e) {
-                throw new RuntimeException(e);
+            } catch (Throwable e) {
+                // SipService died? SIP stack died?
+                Log.w(TAG, "getUri(): " + e);
+                return null;
             }
         }
 
diff --git a/voip/java/com/android/server/sip/SipSessionGroup.java b/voip/java/com/android/server/sip/SipSessionGroup.java
index c68fa1b..bc377cf 100644
--- a/voip/java/com/android/server/sip/SipSessionGroup.java
+++ b/voip/java/com/android/server/sip/SipSessionGroup.java
@@ -49,6 +49,7 @@
 import javax.sip.IOExceptionEvent;
 import javax.sip.InvalidArgumentException;
 import javax.sip.ListeningPoint;
+import javax.sip.ObjectInUseException;
 import javax.sip.RequestEvent;
 import javax.sip.ResponseEvent;
 import javax.sip.ServerTransaction;
@@ -415,11 +416,25 @@
             mPeerProfile = null;
             mState = SipSession.State.READY_TO_CALL;
             mInviteReceived = null;
-            mDialog = null;
-            mServerTransaction = null;
-            mClientTransaction = null;
             mPeerSessionDescription = null;
 
+            if (mDialog != null) mDialog.delete();
+            mDialog = null;
+
+            try {
+                if (mServerTransaction != null) mServerTransaction.terminate();
+            } catch (ObjectInUseException e) {
+                // ignored
+            }
+            mServerTransaction = null;
+
+            try {
+                if (mClientTransaction != null) mClientTransaction.terminate();
+            } catch (ObjectInUseException e) {
+                // ignored
+            }
+            mClientTransaction = null;
+
             cancelSessionTimer();
         }
 
@@ -884,8 +899,8 @@
                         generateTag());
                 mDialog = mClientTransaction.getDialog();
                 addSipSession(this);
-                mProxy.onCalling(this);
                 startSessionTimer(cmd.getTimeout());
+                mProxy.onCalling(this);
                 return true;
             } else if (evt instanceof RegisterCommand) {
                 mState = SipSession.State.REGISTERING;
@@ -964,8 +979,8 @@
                     // ring back for better UX
                     if (mState == SipSession.State.OUTGOING_CALL) {
                         mState = SipSession.State.OUTGOING_CALL_RING_BACK;
-                        mProxy.onRingingBack(this);
                         cancelSessionTimer();
+                        mProxy.onRingingBack(this);
                     }
                     return true;
                 case Response.OK:
@@ -1222,14 +1237,12 @@
         }
 
         private void onRegistrationFailed(Throwable exception) {
-            reset();
             exception = getRootCause(exception);
             onRegistrationFailed(getErrorCode(exception),
                     exception.toString());
         }
 
         private void onRegistrationFailed(Response response) {
-            reset();
             int statusCode = response.getStatusCode();
             onRegistrationFailed(getErrorCode(statusCode),
                     createErrorMessage(response));