am 97963794: SIP: convert enum to static final int.

Merge commit '97963794af1e18674dd111e3ad344d90b16c922c' into gingerbread-plus-aosp

* commit '97963794af1e18674dd111e3ad344d90b16c922c':
  SIP: convert enum to static final int.
diff --git a/services/java/com/android/server/sip/SipService.java b/services/java/com/android/server/sip/SipService.java
index 7e13d65..3f47be4 100644
--- a/services/java/com/android/server/sip/SipService.java
+++ b/services/java/com/android/server/sip/SipService.java
@@ -476,10 +476,10 @@
         }
 
         @Override
-        public void onError(ISipSession session, String errorClass,
+        public void onError(ISipSession session, int errorCode,
                 String message) {
-            if (DEBUG) Log.d(TAG, "sip session error: " + errorClass + ": "
-                    + message);
+            if (DEBUG) Log.d(TAG, "sip session error: "
+                    + SipErrorCode.toString(errorCode) + ": " + message);
         }
 
         public boolean isOpened() {
@@ -535,7 +535,7 @@
         private int mBackoff = 1;
         private boolean mRegistered;
         private long mExpiryTime;
-        private SipErrorCode mErrorCode;
+        private int mErrorCode;
         private String mErrorMessage;
 
         private String getAction() {
@@ -591,10 +591,9 @@
                 if (mSession == null) return;
 
                 try {
-                    SipSessionState state = (mSession == null)
+                    int state = (mSession == null)
                             ? SipSessionState.READY_TO_CALL
-                            : Enum.valueOf(
-                                    SipSessionState.class, mSession.getState());
+                            : mSession.getState();
                     if ((state == SipSessionState.REGISTERING)
                             || (state == SipSessionState.DEREGISTERING)) {
                         mProxy.onRegistering(mSession);
@@ -602,12 +601,12 @@
                         int duration = (int)
                                 (mExpiryTime - SystemClock.elapsedRealtime());
                         mProxy.onRegistrationDone(mSession, duration);
-                    } else if (mErrorCode != null) {
+                    } else if (mErrorCode != SipErrorCode.NO_ERROR) {
                         if (mErrorCode == SipErrorCode.TIME_OUT) {
                             mProxy.onRegistrationTimeout(mSession);
                         } else {
-                            mProxy.onRegistrationFailed(mSession,
-                                    mErrorCode.toString(), mErrorMessage);
+                            mProxy.onRegistrationFailed(mSession, mErrorCode,
+                                    mErrorMessage);
                         }
                     }
                 } catch (Throwable t) {
@@ -621,7 +620,7 @@
         }
 
         public void run() {
-            mErrorCode = null;
+            mErrorCode = SipErrorCode.NO_ERROR;
             mErrorMessage = null;
             if (DEBUG) Log.d(TAG, "~~~ registering");
             synchronized (SipService.this) {
@@ -714,18 +713,15 @@
         }
 
         @Override
-        public void onRegistrationFailed(ISipSession session,
-                String errorCodeString, String message) {
-            SipErrorCode errorCode =
-                    Enum.valueOf(SipErrorCode.class, errorCodeString);
+        public void onRegistrationFailed(ISipSession session, int errorCode,
+                String message) {
             if (DEBUG) Log.d(TAG, "onRegistrationFailed(): " + session + ": "
-                    + errorCode + ": " + message);
+                    + SipErrorCode.toString(errorCode) + ": " + message);
             synchronized (SipService.this) {
                 if (!isStopped() && (session != mSession)) return;
                 mErrorCode = errorCode;
                 mErrorMessage = message;
-                mProxy.onRegistrationFailed(session, errorCode.toString(),
-                        message);
+                mProxy.onRegistrationFailed(session, errorCode, message);
 
                 if (errorCode == SipErrorCode.INVALID_CREDENTIALS) {
                     if (DEBUG) Log.d(TAG, "   pause auto-registration");
diff --git a/services/java/com/android/server/sip/SipSessionGroup.java b/services/java/com/android/server/sip/SipSessionGroup.java
index baf9a8e..b4c2241 100644
--- a/services/java/com/android/server/sip/SipSessionGroup.java
+++ b/services/java/com/android/server/sip/SipSessionGroup.java
@@ -300,7 +300,8 @@
             boolean isLoggable = isLoggable(session, event);
             boolean processed = (session != null) && session.process(event);
             if (isLoggable && processed) {
-                Log.d(TAG, "new state after: " + session.mState);
+                Log.d(TAG, "new state after: "
+                        + SipSessionState.toString(session.mState));
             }
         } catch (Throwable e) {
             Log.w(TAG, "event process error: " + event, e);
@@ -331,7 +332,8 @@
 
         public boolean process(EventObject evt) throws SipException {
             if (isLoggable(this, evt)) Log.d(TAG, " ~~~~~   " + this + ": "
-                    + mState + ": processing " + log(evt));
+                    + SipSessionState.toString(mState) + ": processing "
+                    + log(evt));
             if (isRequestEvent(Request.INVITE, evt)) {
                 RequestEvent event = (RequestEvent) evt;
                 SipSessionImpl newSession = new SipSessionImpl(mProxy);
@@ -356,7 +358,7 @@
     class SipSessionImpl extends ISipSession.Stub {
         SipProfile mPeerProfile;
         SipSessionListenerProxy mProxy = new SipSessionListenerProxy();
-        SipSessionState mState = SipSessionState.READY_TO_CALL;
+        int mState = SipSessionState.READY_TO_CALL;
         RequestEvent mInviteReceived;
         Dialog mDialog;
         ServerTransaction mServerTransaction;
@@ -447,8 +449,8 @@
             return null;
         }
 
-        public String getState() {
-            return mState.toString();
+        public int getState() {
+            return mState;
         }
 
         public void setListener(ISipSessionListener listener) {
@@ -521,7 +523,7 @@
             mState = SipSessionState.PINGING;
             try {
                 processCommand(new OptionsCommand());
-                while (SipSessionState.PINGING.equals(mState)) {
+                while (SipSessionState.PINGING == mState) {
                     Thread.sleep(1000);
                 }
             } catch (SipException e) {
@@ -547,7 +549,8 @@
         public String toString() {
             try {
                 String s = super.toString();
-                return s.substring(s.indexOf("@")) + ":" + mState;
+                return s.substring(s.indexOf("@")) + ":"
+                        + SipSessionState.toString(mState);
             } catch (Throwable e) {
                 return super.toString();
             }
@@ -555,7 +558,8 @@
 
         public boolean process(EventObject evt) throws SipException {
             if (isLoggable(this, evt)) Log.d(TAG, " ~~~~~   " + this + ": "
-                    + mState + ": processing " + log(evt));
+                    + SipSessionState.toString(mState) + ": processing "
+                    + log(evt));
             synchronized (SipSessionGroup.this) {
                 if (isClosed()) return false;
 
@@ -570,30 +574,30 @@
                 boolean processed;
 
                 switch (mState) {
-                case REGISTERING:
-                case DEREGISTERING:
+                case SipSessionState.REGISTERING:
+                case SipSessionState.DEREGISTERING:
                     processed = registeringToReady(evt);
                     break;
-                case PINGING:
+                case SipSessionState.PINGING:
                     processed = keepAliveProcess(evt);
                     break;
-                case READY_TO_CALL:
+                case SipSessionState.READY_TO_CALL:
                     processed = readyForCall(evt);
                     break;
-                case INCOMING_CALL:
+                case SipSessionState.INCOMING_CALL:
                     processed = incomingCall(evt);
                     break;
-                case INCOMING_CALL_ANSWERING:
+                case SipSessionState.INCOMING_CALL_ANSWERING:
                     processed = incomingCallToInCall(evt);
                     break;
-                case OUTGOING_CALL:
-                case OUTGOING_CALL_RING_BACK:
+                case SipSessionState.OUTGOING_CALL:
+                case SipSessionState.OUTGOING_CALL_RING_BACK:
                     processed = outgoingCall(evt);
                     break;
-                case OUTGOING_CALL_CANCELING:
+                case SipSessionState.OUTGOING_CALL_CANCELING:
                     processed = outgoingCallToReady(evt);
                     break;
-                case IN_CALL:
+                case SipSessionState.IN_CALL:
                     processed = inCall(evt);
                     break;
                 default:
@@ -640,8 +644,8 @@
         private void processTransactionTerminated(
                 TransactionTerminatedEvent event) {
             switch (mState) {
-                case IN_CALL:
-                case READY_TO_CALL:
+                case SipSessionState.IN_CALL:
+                case SipSessionState.READY_TO_CALL:
                     Log.d(TAG, "Transaction terminated; do nothing");
                     break;
                 default:
@@ -666,18 +670,18 @@
                 return;
             }
             switch (mState) {
-                case REGISTERING:
-                case DEREGISTERING:
+                case SipSessionState.REGISTERING:
+                case SipSessionState.DEREGISTERING:
                     reset();
                     mProxy.onRegistrationTimeout(this);
                     break;
-                case INCOMING_CALL:
-                case INCOMING_CALL_ANSWERING:
-                case OUTGOING_CALL:
-                case OUTGOING_CALL_CANCELING:
+                case SipSessionState.INCOMING_CALL:
+                case SipSessionState.INCOMING_CALL_ANSWERING:
+                case SipSessionState.OUTGOING_CALL:
+                case SipSessionState.OUTGOING_CALL_CANCELING:
                     onError(SipErrorCode.TIME_OUT, event.toString());
                     break;
-                case PINGING:
+                case SipSessionState.PINGING:
                     reset();
                     mReRegisterFlag = true;
                     mState = SipSessionState.READY_TO_CALL;
@@ -753,7 +757,7 @@
                 int statusCode = response.getStatusCode();
                 switch (statusCode) {
                 case Response.OK:
-                    SipSessionState state = mState;
+                    int state = mState;
                     onRegistrationDone((state == SipSessionState.REGISTERING)
                             ? getExpiryTime(((ResponseEvent) evt).getResponse())
                             : -1);
@@ -1062,10 +1066,9 @@
             mProxy.onCallEstablished(this, mPeerSessionDescription);
         }
 
-        private void fallbackToPreviousInCall(SipErrorCode errorCode,
-                String message) {
+        private void fallbackToPreviousInCall(int errorCode, String message) {
             mState = SipSessionState.IN_CALL;
-            mProxy.onCallChangeFailed(this, errorCode.toString(), message);
+            mProxy.onCallChangeFailed(this, errorCode, message);
         }
 
         private void endCallNormally() {
@@ -1073,9 +1076,9 @@
             mProxy.onCallEnded(this);
         }
 
-        private void endCallOnError(SipErrorCode errorCode, String message) {
+        private void endCallOnError(int errorCode, String message) {
             reset();
-            mProxy.onError(this, errorCode.toString(), message);
+            mProxy.onError(this, errorCode, message);
         }
 
         private void endCallOnBusy() {
@@ -1083,11 +1086,11 @@
             mProxy.onCallBusy(this);
         }
 
-        private void onError(SipErrorCode errorCode, String message) {
+        private void onError(int errorCode, String message) {
             cancelSessionTimer();
             switch (mState) {
-                case REGISTERING:
-                case DEREGISTERING:
+                case SipSessionState.REGISTERING:
+                case SipSessionState.DEREGISTERING:
                     onRegistrationFailed(errorCode, message);
                     break;
                 default:
@@ -1115,7 +1118,7 @@
             }
         }
 
-        private SipErrorCode getErrorCode(int responseStatusCode) {
+        private int getErrorCode(int responseStatusCode) {
             switch (responseStatusCode) {
                 case Response.TEMPORARILY_UNAVAILABLE:
                 case Response.FORBIDDEN:
@@ -1151,7 +1154,7 @@
             return exception;
         }
 
-        private SipErrorCode getErrorCode(Throwable exception) {
+        private int getErrorCode(Throwable exception) {
             String message = exception.getMessage();
             if (exception instanceof UnknownHostException) {
                 return SipErrorCode.INVALID_REMOTE_URI;
@@ -1169,10 +1172,9 @@
             mProxy.onRegistrationDone(this, duration);
         }
 
-        private void onRegistrationFailed(SipErrorCode errorCode,
-                String message) {
+        private void onRegistrationFailed(int errorCode, String message) {
             reset();
-            mProxy.onRegistrationFailed(this, errorCode.toString(), message);
+            mProxy.onRegistrationFailed(this, errorCode, message);
         }
 
         private void onRegistrationFailed(Throwable exception) {
@@ -1262,7 +1264,7 @@
     private static boolean isLoggable(SipSessionImpl s) {
         if (s != null) {
             switch (s.mState) {
-                case PINGING:
+                case SipSessionState.PINGING:
                     return DEBUG_PING;
             }
         }
diff --git a/services/java/com/android/server/sip/SipSessionListenerProxy.java b/services/java/com/android/server/sip/SipSessionListenerProxy.java
index 747d79f..a4cd102 100644
--- a/services/java/com/android/server/sip/SipSessionListenerProxy.java
+++ b/services/java/com/android/server/sip/SipSessionListenerProxy.java
@@ -124,7 +124,7 @@
     }
 
     public void onCallChangeFailed(final ISipSession session,
-            final String errorCode, final String message) {
+            final int errorCode, final String message) {
         if (mListener == null) return;
         proxy(new Runnable() {
             public void run() {
@@ -137,7 +137,7 @@
         });
     }
 
-    public void onError(final ISipSession session, final String errorCode,
+    public void onError(final ISipSession session, final int errorCode,
             final String message) {
         if (mListener == null) return;
         proxy(new Runnable() {
@@ -179,7 +179,7 @@
     }
 
     public void onRegistrationFailed(final ISipSession session,
-            final String errorCode, final String message) {
+            final int errorCode, final String message) {
         if (mListener == null) return;
         proxy(new Runnable() {
             public void run() {
diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhone.java b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
index 4887950..3e9fb99 100755
--- a/telephony/java/com/android/internal/telephony/sip/SipPhone.java
+++ b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
@@ -802,15 +802,15 @@
 
     private static Call.State getCallStateFrom(SipAudioCall sipAudioCall) {
         if (sipAudioCall.isOnHold()) return Call.State.HOLDING;
-        SipSessionState sessionState = sipAudioCall.getState();
+        int sessionState = sipAudioCall.getState();
         switch (sessionState) {
-            case READY_TO_CALL:            return Call.State.IDLE;
-            case INCOMING_CALL:
-            case INCOMING_CALL_ANSWERING:  return Call.State.INCOMING;
-            case OUTGOING_CALL:            return Call.State.DIALING;
-            case OUTGOING_CALL_RING_BACK:  return Call.State.ALERTING;
-            case OUTGOING_CALL_CANCELING:  return Call.State.DISCONNECTING;
-            case IN_CALL:                  return Call.State.ACTIVE;
+            case SipSessionState.READY_TO_CALL:            return Call.State.IDLE;
+            case SipSessionState.INCOMING_CALL:
+            case SipSessionState.INCOMING_CALL_ANSWERING:  return Call.State.INCOMING;
+            case SipSessionState.OUTGOING_CALL:            return Call.State.DIALING;
+            case SipSessionState.OUTGOING_CALL_RING_BACK:  return Call.State.ALERTING;
+            case SipSessionState.OUTGOING_CALL_CANCELING:  return Call.State.DISCONNECTING;
+            case SipSessionState.IN_CALL:                  return Call.State.ACTIVE;
             default:
                 Log.w(LOG_TAG, "illegal connection state: " + sessionState);
                 return Call.State.DISCONNECTED;
@@ -832,30 +832,31 @@
         }
 
         @Override
-        public void onError(SipAudioCall call, SipErrorCode errorCode,
+        public void onError(SipAudioCall call, int errorCode,
                 String errorMessage) {
             switch (errorCode) {
-                case PEER_NOT_REACHABLE:
+                case SipErrorCode.PEER_NOT_REACHABLE:
                     onError(Connection.DisconnectCause.NUMBER_UNREACHABLE);
                     break;
-                case INVALID_REMOTE_URI:
+                case SipErrorCode.INVALID_REMOTE_URI:
                     onError(Connection.DisconnectCause.INVALID_NUMBER);
                     break;
-                case TIME_OUT:
-                case TRANSACTION_TERMINTED:
+                case SipErrorCode.TIME_OUT:
+                case SipErrorCode.TRANSACTION_TERMINTED:
                     onError(Connection.DisconnectCause.TIMED_OUT);
                     break;
-                case DATA_CONNECTION_LOST:
+                case SipErrorCode.DATA_CONNECTION_LOST:
                     onError(Connection.DisconnectCause.LOST_SIGNAL);
                     break;
-                case INVALID_CREDENTIALS:
+                case SipErrorCode.INVALID_CREDENTIALS:
                     onError(Connection.DisconnectCause.INVALID_CREDENTIALS);
                     break;
-                case SOCKET_ERROR:
-                case SERVER_ERROR:
-                case CLIENT_ERROR:
+                case SipErrorCode.SOCKET_ERROR:
+                case SipErrorCode.SERVER_ERROR:
+                case SipErrorCode.CLIENT_ERROR:
                 default:
-                    Log.w(LOG_TAG, "error: " + errorCode + ": " + errorMessage);
+                    Log.w(LOG_TAG, "error: " + SipErrorCode.toString(errorCode)
+                            + ": " + errorMessage);
                     onError(Connection.DisconnectCause.ERROR_UNSPECIFIED);
             }
         }
diff --git a/voip/java/android/net/sip/ISipSession.aidl b/voip/java/android/net/sip/ISipSession.aidl
index 5661b8f..2d515db 100644
--- a/voip/java/android/net/sip/ISipSession.aidl
+++ b/voip/java/android/net/sip/ISipSession.aidl
@@ -49,14 +49,11 @@
 
     /**
      * Gets the session state. The value returned must be one of the states in
-     * {@link SipSessionState}. One may convert it to {@link SipSessionState} by
-     * <code>
-     *      Enum.valueOf(SipSessionState.class, session.getState());
-     * </code>
+     * {@link SipSessionState}.
      *
      * @return the session state
      */
-    String getState();
+    int getState();
 
     /**
      * Checks if the session is in a call.
diff --git a/voip/java/android/net/sip/ISipSessionListener.aidl b/voip/java/android/net/sip/ISipSessionListener.aidl
index 0a6220b..5920bca 100644
--- a/voip/java/android/net/sip/ISipSessionListener.aidl
+++ b/voip/java/android/net/sip/ISipSessionListener.aidl
@@ -79,8 +79,7 @@
      * @param errorCode error code defined in {@link SipErrorCode}
      * @param errorMessage error message
      */
-    void onError(in ISipSession session, String errorCode,
-            String errorMessage);
+    void onError(in ISipSession session, int errorCode, String errorMessage);
 
     /**
      * Called when an error occurs during session modification negotiation.
@@ -89,7 +88,7 @@
      * @param errorCode error code defined in {@link SipErrorCode}
      * @param errorMessage error message
      */
-    void onCallChangeFailed(in ISipSession session, String errorCode,
+    void onCallChangeFailed(in ISipSession session, int errorCode,
             String errorMessage);
 
     /**
@@ -114,7 +113,7 @@
      * @param errorCode error code defined in {@link SipErrorCode}
      * @param errorMessage error message
      */
-    void onRegistrationFailed(in ISipSession session, String errorCode,
+    void onRegistrationFailed(in ISipSession session, int errorCode,
             String errorMessage);
 
     /**
diff --git a/voip/java/android/net/sip/SipAudioCall.java b/voip/java/android/net/sip/SipAudioCall.java
index 4abea20..0069fe0 100644
--- a/voip/java/android/net/sip/SipAudioCall.java
+++ b/voip/java/android/net/sip/SipAudioCall.java
@@ -90,9 +90,9 @@
          * @param call the call object that carries out the audio call
          * @param errorCode error code of this error
          * @param errorMessage error message
+         * @see SipErrorCode
          */
-        void onError(SipAudioCall call, SipErrorCode errorCode,
-                String errorMessage);
+        void onError(SipAudioCall call, int errorCode, String errorMessage);
     }
 
     /**
@@ -126,7 +126,7 @@
         public void onCallHeld(SipAudioCall call) {
             onChanged(call);
         }
-        public void onError(SipAudioCall call, SipErrorCode errorCode,
+        public void onError(SipAudioCall call, int errorCode,
                 String errorMessage) {
             onChanged(call);
         }
@@ -318,10 +318,11 @@
 
     /**
      * Gets the state of the {@link ISipSession} that carries this call.
+     * The value returned must be one of the states in {@link SipSessionState}.
      *
      * @return the session state
      */
-    SipSessionState getState();
+    int getState();
 
     /**
      * Gets the {@link ISipSession} that carries this call.
diff --git a/voip/java/android/net/sip/SipAudioCallImpl.java b/voip/java/android/net/sip/SipAudioCallImpl.java
index e61e878..111bfff 100644
--- a/voip/java/android/net/sip/SipAudioCallImpl.java
+++ b/voip/java/android/net/sip/SipAudioCallImpl.java
@@ -81,7 +81,7 @@
     private WifiManager mWm;
     private WifiManager.WifiLock mWifiHighPerfLock;
 
-    private SipErrorCode mErrorCode;
+    private int mErrorCode = SipErrorCode.NO_ERROR;
     private String mErrorMessage;
 
     public SipAudioCallImpl(Context context, SipProfile localProfile) {
@@ -100,7 +100,7 @@
         try {
             if ((listener == null) || !callbackImmediately) {
                 // do nothing
-            } else if (mErrorCode != null) {
+            } else if (mErrorCode != SipErrorCode.NO_ERROR) {
                 listener.onError(this, mErrorCode, mErrorMessage);
             } else if (mInCall) {
                 if (mHold) {
@@ -109,18 +109,18 @@
                     listener.onCallEstablished(this);
                 }
             } else {
-                SipSessionState state = getState();
+                int state = getState();
                 switch (state) {
-                    case READY_TO_CALL:
+                    case SipSessionState.READY_TO_CALL:
                         listener.onReadyToCall(this);
                         break;
-                    case INCOMING_CALL:
+                    case SipSessionState.INCOMING_CALL:
                         listener.onRinging(this, getPeerProfile(mSipSession));
                         break;
-                    case OUTGOING_CALL:
+                    case SipSessionState.OUTGOING_CALL:
                         listener.onCalling(this);
                         break;
-                    case OUTGOING_CALL_RING_BACK:
+                    case SipSessionState.OUTGOING_CALL_RING_BACK:
                         listener.onRingingBack(this);
                         break;
                 }
@@ -150,7 +150,7 @@
         mInCall = false;
         mHold = false;
         mSessionId = -1L;
-        mErrorCode = null;
+        mErrorCode = SipErrorCode.NO_ERROR;
         mErrorMessage = null;
 
         if (mSipSession != null) {
@@ -175,10 +175,10 @@
         }
     }
 
-    public synchronized SipSessionState getState() {
+    public synchronized int getState() {
         if (mSipSession == null) return SipSessionState.READY_TO_CALL;
         try {
-            return Enum.valueOf(SipSessionState.class, mSipSession.getState());
+            return mSipSession.getState();
         } catch (RemoteException e) {
             return SipSessionState.REMOTE_ERROR;
         }
@@ -294,15 +294,11 @@
         }
     }
 
-    private SipErrorCode getErrorCode(String errorCode) {
-        return Enum.valueOf(SipErrorCode.class, errorCode);
-    }
-
     @Override
-    public void onCallChangeFailed(ISipSession session, String errorCode,
+    public void onCallChangeFailed(ISipSession session, int errorCode,
             String message) {
         Log.d(TAG, "sip call change failed: " + message);
-        mErrorCode = getErrorCode(errorCode);
+        mErrorCode = errorCode;
         mErrorMessage = message;
         Listener listener = mListener;
         if (listener != null) {
@@ -315,10 +311,10 @@
     }
 
     @Override
-    public void onError(ISipSession session, String errorCodeString,
-            String message) {
-        Log.d(TAG, "sip session error: " + errorCodeString + ": " + message);
-        SipErrorCode errorCode = mErrorCode = getErrorCode(errorCodeString);
+    public void onError(ISipSession session, int errorCode, String message) {
+        Log.d(TAG, "sip session error: " + SipErrorCode.toString(errorCode)
+                + ": " + message);
+        mErrorCode = errorCode;
         mErrorMessage = message;
         synchronized (this) {
             if ((mErrorCode == SipErrorCode.DATA_CONNECTION_LOST)
@@ -608,10 +604,10 @@
         try {
             startAudioInternal();
         } catch (UnknownHostException e) {
-            onError(mSipSession, SipErrorCode.PEER_NOT_REACHABLE.toString(),
+            onError(mSipSession, SipErrorCode.PEER_NOT_REACHABLE,
                     e.getMessage());
         } catch (Throwable e) {
-            onError(mSipSession, SipErrorCode.CLIENT_ERROR.toString(),
+            onError(mSipSession, SipErrorCode.CLIENT_ERROR,
                     e.getMessage());
         }
     }
diff --git a/voip/java/android/net/sip/SipErrorCode.java b/voip/java/android/net/sip/SipErrorCode.java
index a27f740..7496d28 100644
--- a/voip/java/android/net/sip/SipErrorCode.java
+++ b/voip/java/android/net/sip/SipErrorCode.java
@@ -24,34 +24,69 @@
  * {@link ISipSessionListener#onRegistrationFailed}.
  * @hide
  */
-public enum SipErrorCode {
+public class SipErrorCode {
+    /** Not an error. */
+    public static final int NO_ERROR = 0;
+
     /** When some socket error occurs. */
-    SOCKET_ERROR,
+    public static final int SOCKET_ERROR = -1;
 
     /** When server responds with an error. */
-    SERVER_ERROR,
+    public static final int SERVER_ERROR = -2;
 
     /** When transaction is terminated unexpectedly. */
-    TRANSACTION_TERMINTED,
+    public static final int TRANSACTION_TERMINTED = -3;
 
     /** When some error occurs on the device, possibly due to a bug. */
-    CLIENT_ERROR,
+    public static final int CLIENT_ERROR = -4;
 
     /** When the transaction gets timed out. */
-    TIME_OUT,
+    public static final int TIME_OUT = -5;
 
     /** When the remote URI is not valid. */
-    INVALID_REMOTE_URI,
+    public static final int INVALID_REMOTE_URI = -6;
 
     /** When the peer is not reachable. */
-    PEER_NOT_REACHABLE,
+    public static final int PEER_NOT_REACHABLE = -7;
 
     /** When invalid credentials are provided. */
-    INVALID_CREDENTIALS,
+    public static final int INVALID_CREDENTIALS = -8;
 
     /** The client is in a transaction and cannot initiate a new one. */
-    IN_PROGRESS,
+    public static final int IN_PROGRESS = -9;
 
     /** When data connection is lost. */
-    DATA_CONNECTION_LOST;
+    public static final int DATA_CONNECTION_LOST = -10;
+
+    public static String toString(int errorCode) {
+        switch (errorCode) {
+            case NO_ERROR:
+                return "NO_ERROR";
+            case SOCKET_ERROR:
+                return "SOCKET_ERROR";
+            case SERVER_ERROR:
+                return "SERVER_ERROR";
+            case TRANSACTION_TERMINTED:
+                return "TRANSACTION_TERMINTED";
+            case CLIENT_ERROR:
+                return "CLIENT_ERROR";
+            case TIME_OUT:
+                return "TIME_OUT";
+            case INVALID_REMOTE_URI:
+                return "INVALID_REMOTE_URI";
+            case PEER_NOT_REACHABLE:
+                return "PEER_NOT_REACHABLE";
+            case INVALID_CREDENTIALS:
+                return "INVALID_CREDENTIALS";
+            case IN_PROGRESS:
+                return "IN_PROGRESS";
+            case DATA_CONNECTION_LOST:
+                return "DATA_CONNECTION_LOST";
+            default:
+                return "UNKNOWN";
+        }
+    }
+
+    private SipErrorCode() {
+    }
 }
diff --git a/voip/java/android/net/sip/SipManager.java b/voip/java/android/net/sip/SipManager.java
index 9ee6f34..31768d7 100644
--- a/voip/java/android/net/sip/SipManager.java
+++ b/voip/java/android/net/sip/SipManager.java
@@ -511,10 +511,9 @@
         }
 
         @Override
-        public void onRegistrationFailed(ISipSession session, String errorCode,
+        public void onRegistrationFailed(ISipSession session, int errorCode,
                 String message) {
-            mListener.onRegistrationFailed(getUri(session),
-                    Enum.valueOf(SipErrorCode.class, errorCode), message);
+            mListener.onRegistrationFailed(getUri(session), errorCode, message);
         }
 
         @Override
diff --git a/voip/java/android/net/sip/SipRegistrationListener.java b/voip/java/android/net/sip/SipRegistrationListener.java
index 705f271..37c9ce2 100644
--- a/voip/java/android/net/sip/SipRegistrationListener.java
+++ b/voip/java/android/net/sip/SipRegistrationListener.java
@@ -42,7 +42,8 @@
      * @param localProfileUri the URI string of the SIP profile to register with
      * @param errorCode error code of this error
      * @param errorMessage error message
+     * @see SipErrorCode
      */
-    void onRegistrationFailed(String localProfileUri, SipErrorCode errorCode,
+    void onRegistrationFailed(String localProfileUri, int errorCode,
             String errorMessage);
 }
diff --git a/voip/java/android/net/sip/SipSessionAdapter.java b/voip/java/android/net/sip/SipSessionAdapter.java
index 6020f2c..86aca37 100644
--- a/voip/java/android/net/sip/SipSessionAdapter.java
+++ b/voip/java/android/net/sip/SipSessionAdapter.java
@@ -42,11 +42,11 @@
     public void onCallBusy(ISipSession session) {
     }
 
-    public void onCallChangeFailed(ISipSession session, String errorCode,
+    public void onCallChangeFailed(ISipSession session, int errorCode,
             String message) {
     }
 
-    public void onError(ISipSession session, String errorCode, String message) {
+    public void onError(ISipSession session, int errorCode, String message) {
     }
 
     public void onRegistering(ISipSession session) {
@@ -55,7 +55,7 @@
     public void onRegistrationDone(ISipSession session, int duration) {
     }
 
-    public void onRegistrationFailed(ISipSession session, String errorCode,
+    public void onRegistrationFailed(ISipSession session, int errorCode,
             String message) {
     }
 
diff --git a/voip/java/android/net/sip/SipSessionState.java b/voip/java/android/net/sip/SipSessionState.java
index 5bab112..31e9d3f 100644
--- a/voip/java/android/net/sip/SipSessionState.java
+++ b/voip/java/android/net/sip/SipSessionState.java
@@ -20,47 +20,75 @@
  * Defines {@link ISipSession} states.
  * @hide
  */
-public enum SipSessionState {
+public class SipSessionState {
     /** When session is ready to initiate a call or transaction. */
-    READY_TO_CALL,
+    public static final int READY_TO_CALL = 0;
 
     /** When the registration request is sent out. */
-    REGISTERING,
+    public static final int REGISTERING = 1;
 
     /** When the unregistration request is sent out. */
-    DEREGISTERING,
+    public static final int DEREGISTERING = 2;
 
     /** When an INVITE request is received. */
-    INCOMING_CALL,
+    public static final int INCOMING_CALL = 3;
 
     /** When an OK response is sent for the INVITE request received. */
-    INCOMING_CALL_ANSWERING,
+    public static final int INCOMING_CALL_ANSWERING = 4;
 
     /** When an INVITE request is sent. */
-    OUTGOING_CALL,
+    public static final int OUTGOING_CALL = 5;
 
     /** When a RINGING response is received for the INVITE request sent. */
-    OUTGOING_CALL_RING_BACK,
+    public static final int OUTGOING_CALL_RING_BACK = 6;
 
     /** When a CANCEL request is sent for the INVITE request sent. */
-    OUTGOING_CALL_CANCELING,
+    public static final int OUTGOING_CALL_CANCELING = 7;
 
     /** When a call is established. */
-    IN_CALL,
+    public static final int IN_CALL = 8;
 
     /** Some error occurs when making a remote call to {@link ISipSession}. */
-    REMOTE_ERROR,
+    public static final int REMOTE_ERROR = 9;
 
     /** When an OPTIONS request is sent. */
-    PINGING;
+    public static final int PINGING = 10;
+
+    /** Not defined. */
+    public static final int NOT_DEFINED = 101;
 
     /**
-     * Checks if the specified string represents the same state as this object.
-     *
-     * @return true if the specified string represents the same state as this
-     *      object
+     * Converts the state to string.
      */
-    public boolean equals(String state) {
-        return toString().equals(state);
+    public static String toString(int state) {
+        switch (state) {
+            case READY_TO_CALL:
+                return "READY_TO_CALL";
+            case REGISTERING:
+                return "REGISTERING";
+            case DEREGISTERING:
+                return "DEREGISTERING";
+            case INCOMING_CALL:
+                return "INCOMING_CALL";
+            case INCOMING_CALL_ANSWERING:
+                return "INCOMING_CALL_ANSWERING";
+            case OUTGOING_CALL:
+                return "OUTGOING_CALL";
+            case OUTGOING_CALL_RING_BACK:
+                return "OUTGOING_CALL_RING_BACK";
+            case OUTGOING_CALL_CANCELING:
+                return "OUTGOING_CALL_CANCELING";
+            case IN_CALL:
+                return "IN_CALL";
+            case REMOTE_ERROR:
+                return "REMOTE_ERROR";
+            case PINGING:
+                return "PINGING";
+            default:
+                return "NOT_DEFINED";
+        }
+    }
+
+    private SipSessionState() {
     }
 }