#16928: Fix getCallInstance from CallList
diff --git a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
index 982c91f..9745636 100644
--- a/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
+++ b/src/com/savoirfairelinux/sflphone/client/SFLPhoneHome.java
@@ -94,7 +94,7 @@
     private boolean mBound = false;
     private ISipService service;
     public AccountList mAccountList = new AccountList();
-    public CallList mCallList = new CallList();
+    public CallList mCallList = new CallList(this);
 
     /**
      * The {@link ViewPager} that will host the section contents.
@@ -506,7 +506,9 @@
             info.mEmail = "coolGuy@coolGuy.com";
 
             SipCall call = CallList.getCallInstance(info);
-            call.launchCallActivity(this);
+            // call.launchCallActivity(this);
+            call.printCallInfo();
+            call.placeCall();
         
             Log.d(TAG, "service.placeCall(" + accountID + ", " + callID + ", " + to + ");");
             service.placeCall(accountID, callID, to);
@@ -542,18 +544,4 @@
 
         buttonCall.setImageResource(R.drawable.ic_call);
     }
-
-/*
-    private void launchCallActivity(SipCall call)
-    {
-        Log.i(TAG, "Launch Call Activity");
-        Bundle bundle = new Bundle();
-        // bundle.putString("CallID", call.mCallInfo.mCallID);
-        call.mCallInfo.mCallID = "UNEBELLEPOULE";
-        bundle.putParcelable("CallInfo", call.mCallInfo);
-        Intent intent = new Intent().setClass(this, CallActivity.class);
-        intent.putExtras(bundle);
-        startActivity(intent);
-    }
-    */
 }
diff --git a/src/com/savoirfairelinux/sflphone/client/SipCall.java b/src/com/savoirfairelinux/sflphone/client/SipCall.java
index e630672..3ef8265 100644
--- a/src/com/savoirfairelinux/sflphone/client/SipCall.java
+++ b/src/com/savoirfairelinux/sflphone/client/SipCall.java
@@ -52,10 +52,11 @@
     public static int CALL_STATE_INCOMING = 1;
     public static int CALL_STATE_RINGING = 2;
     public static int CALL_STATE_CURRENT = 3;
-    public static int CALL_STATE_BUSY = 4;
-    public static int CALL_STATE_FAILURE = 5;
-    public static int CALL_STATE_HOLD = 6;
-    public static int CALL_STATE_UNHOLD = 7;
+    public static int CALL_STATE_HUNGUP = 4;
+    public static int CALL_STATE_BUSY = 5;
+    public static int CALL_STATE_FAILURE = 6;
+    public static int CALL_STATE_HOLD = 7;
+    public static int CALL_STATE_UNHOLD = 8;
 
     public static int MEDIA_STATE_NONE = 0;        // No media currently
     public static int MEDIA_STATE_ACTIVE = 1;      // Media is active
@@ -66,6 +67,7 @@
     public static class CallInfo implements Parcelable
     {
         public String mCallID = "";
+        public String mAccountID = "";
         public String mDisplayName = "";
         public String mPhone = "";
         public String mEmail = "";
@@ -84,6 +86,7 @@
 
             // Don't mess with this order!!!
             list.add(mCallID);
+            list.add(mAccountID);
             list.add(mDisplayName);
             list.add(mPhone);
             list.add(mEmail);
@@ -112,10 +115,11 @@
 
             // Don't mess with this order!!!
             mCallID = list.get(0);
-            mDisplayName = list.get(1);
-            mPhone = list.get(2);
-            mEmail = list.get(3);
-            mRemoteContact = list.get(4);
+            mAccountID = list.get(1);
+            mDisplayName = list.get(2);
+            mPhone = list.get(3);
+            mEmail = list.get(4);
+            mRemoteContact = list.get(5);
 
             mCallState = in.readInt();
             mMediaState = in.readInt();
@@ -145,6 +149,14 @@
         return mCallInfo.mCallID;
     }
 
+    public void setAccountID(String accountID) {
+        mCallInfo.mAccountID = accountID;
+    }
+
+    public String getAccountID() {
+        return mCallInfo.mAccountID;
+    }
+
     public void setDisplayName(String displayName) {
         mCallInfo.mDisplayName = displayName;
     }
@@ -197,7 +209,12 @@
     {
         if(mCallElementList != null)
             mCallElementList.addCall(this); 
-        // mManager.callmanagerJNI.placeCall("IP2IP", "CALL1234", "192.168.40.35");
+    }
+
+    public void receiveCall()
+    {
+        if(mCallElementList != null)
+            mCallElementList.addCall(this); 
     }
 
     public void answer()
@@ -237,6 +254,16 @@
         Log.i(TAG, "Send text message");
     }
 
+    public void printCallInfo()
+    {
+        Log.i(TAG, "CallInfo: CallID: " + mCallInfo.mCallID);
+        Log.i(TAG, "          AccountID: " + mCallInfo.mAccountID);
+        Log.i(TAG, "          Display Name: " + mCallInfo.mDisplayName);
+        Log.i(TAG, "          Phone: " + mCallInfo.mPhone);
+        Log.i(TAG, "          Email: " + mCallInfo.mEmail);
+        Log.i(TAG, "          Contact: " + mCallInfo.mRemoteContact);
+    }
+
     public void launchCallActivity(Context context)
     {
         Log.i(TAG, "Launch Call Activity");
diff --git a/src/com/savoirfairelinux/sflphone/utils/CallList.java b/src/com/savoirfairelinux/sflphone/utils/CallList.java
index 2ac5b08..051bed9 100644
--- a/src/com/savoirfairelinux/sflphone/utils/CallList.java
+++ b/src/com/savoirfairelinux/sflphone/utils/CallList.java
@@ -47,6 +47,7 @@
 {
     static final String TAG = "CallList";
     static ArrayList<SipCall> mList = new ArrayList<SipCall>();
+    private Context mContext = null;
 
     private enum Signals {
         NEW_CALL_CREATED,
@@ -60,8 +61,11 @@
      */
     public static SipCall getCallInstance(SipCall.CallInfo info)
     {
-        if(mList.isEmpty())
-            return new SipCall(info);
+        if(mList.isEmpty()) {
+            SipCall call = new SipCall(info);
+            mList.add(call);
+            return call;
+        }
 
         for(SipCall sipcall : mList) {
             if(sipcall.mCallInfo.mCallID.equals(info.mCallID)) {
@@ -75,6 +79,10 @@
         return call;
     }
 
+    public CallList(Context context) {
+        mContext = context;
+    }
+
     @Override
     public void onReceive(Context context, Intent intent)
     {
@@ -85,17 +93,18 @@
         } else if(signalName.equals(CallManagerCallBack.CALL_STATE_CHANGED)) {
             processCallStateChangedSignal(intent);
         } else if(signalName.equals(CallManagerCallBack.INCOMING_CALL)) {
+            processIncomingCallSignal(intent);
         }
     }
 
     private void processCallStateChangedSignal(Intent intent) {
         Bundle bundle = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
-        String callID = bundle.getString("CallID");
-        String newState = bundle.getString("State");
 
         SipCall.CallInfo info = new SipCall.CallInfo();
-        info.mCallID = callID;
-                
+        info.mCallID = bundle.getString("CallID");
+
+        String newState = bundle.getString("State");
+
         SipCall call = getCallInstance(info);
         if(newState.equals("INCOMING")) {
             call.setCallState(SipCall.CALL_STATE_INCOMING);
@@ -103,6 +112,11 @@
             call.setCallState(SipCall.CALL_STATE_RINGING);
         } else if(newState.equals("CURRENT")) {
             call.setCallState(SipCall.CALL_STATE_CURRENT);
+        } else if(newState.equals("HUNGUP")) {
+            Log.i(TAG, "         !!!!!!!!! RECEIVING NEW STATE HANGUP");
+            call.printCallInfo();
+            call.hangup();
+            call.setCallState(SipCall.CALL_STATE_HUNGUP);
         } else if(newState.equals("BUSY")) {
             call.setCallState(SipCall.CALL_STATE_BUSY);
         } else if(newState.equals("FAILURE")) {
@@ -111,6 +125,22 @@
             call.setCallState(SipCall.CALL_STATE_HOLD);
         } else if(newState.equals("UNHOLD")) {
             call.setCallState(SipCall.CALL_STATE_UNHOLD);
+        } else {
+            call.setCallState(SipCall.CALL_STATE_NULL);
         }
     }
+
+    private void processIncomingCallSignal(Intent intent) {
+        Bundle bundle = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
+        String accountID = bundle.getString("AccountID");
+        String callID = bundle.getString("CallID");
+        String from = bundle.getString("From");
+
+        SipCall.CallInfo info = new SipCall.CallInfo();
+        info.mCallID = callID;
+                
+        SipCall call = getCallInstance(info);
+        call.placeCall();
+        call.launchCallActivity(mContext); 
+    }
 }