* #24121 First integration of IM working
diff --git a/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java b/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
index 921997b..c0390e3 100644
--- a/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
+++ b/src/com/savoirfairelinux/sflphone/service/CallManagerCallBack.java
@@ -15,6 +15,7 @@
     static public final String NEW_CALL_CREATED = "new-call-created"; 
     static public final String CALL_STATE_CHANGED = "call-state-changed";
     static public final String INCOMING_CALL = "incoming-call";
+    static public final String INCOMING_TEXT = "incoming-text";
 
     public CallManagerCallBack(Context context) {
         mContext = context;
@@ -49,6 +50,12 @@
     }
     
     @Override
+    public void on_incoming_message(String ID, String from, String msg){
+        Log.w(TAG,"on_incoming_message:"+msg);
+        sendIncomingTextMessage(ID, from, msg);
+    }
+    
+    @Override
     public void on_conference_removed(String confID){
         Log.w(TAG,"CONFERENCE REMOVED:"+confID);
     }
@@ -89,4 +96,17 @@
         intent.putExtra("com.savoirfairelinux.sflphone.service.newcall", bundle);
         LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
     }
+    
+    private void sendIncomingTextMessage(String id, String from, String msg) {
+        Bundle bundle = new Bundle();
+
+        bundle.putString("CallID", id);
+        bundle.putString("From", from);
+        bundle.putString("Msg", msg);
+        Intent intent = new Intent(INCOMING_TEXT);
+        intent.putExtra(SIGNAL_NAME, INCOMING_TEXT); 
+        intent.putExtra("com.savoirfairelinux.sflphone.service.newtext", bundle);
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
+        
+    }
 }
diff --git a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerJNI.java b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerJNI.java
index 765a8bf..310e5d8 100644
--- a/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerJNI.java
+++ b/src/com/savoirfairelinux/sflphone/service/ConfigurationManagerJNI.java
@@ -199,6 +199,10 @@
     SFLPhoneserviceJNI.ConfigurationManagerJNI_setIsAlwaysRecording(swigCPtr, this, rec);
   }
 
+  public void setRecordingCall(String id) {
+    SFLPhoneserviceJNI.ConfigurationManagerJNI_setRecordingCall(swigCPtr, this, id);
+  }
+
   public SWIGTYPE_p_int32_t getHistoryLimit() {
     return new SWIGTYPE_p_int32_t(SFLPhoneserviceJNI.ConfigurationManagerJNI_getHistoryLimit(swigCPtr, this), true);
   }
diff --git a/src/com/savoirfairelinux/sflphone/service/ISipClient.aidl b/src/com/savoirfairelinux/sflphone/service/ISipClient.aidl
index b845f66..068b2c1 100644
--- a/src/com/savoirfairelinux/sflphone/service/ISipClient.aidl
+++ b/src/com/savoirfairelinux/sflphone/service/ISipClient.aidl
@@ -3,4 +3,5 @@
 interface ISipClient {
     void incomingCall(in Intent call);
     void callStateChanged(in Intent callState);
+    void incomingText(in Intent msg);
 }
\ No newline at end of file
diff --git a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
index eb76ffb..2450f97 100644
--- a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
+++ b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
@@ -17,8 +17,18 @@
     void setAccountDetails(in String accountId, in Map accountDetails);
     void setAudioPlugin(in String callID);
     String getCurrentAudioOutputPlugin();
+    
+    /* History */
     List getHistory();
     
+    /* Recording */
+    void setRecordPath(in String path);
+    String getRecordPath();
+    void setRecordingCall(in String id);
+    
+    /* IM */
+    void sendTextMessage(in String callID, in String message, in String from);
+    
     void registerClient(in ISipClient callback);
     
     void transfer(in String callID, in String to);
diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index ef04a4c..03b5233 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -66,7 +66,7 @@
     private ManagerImpl managerImpl;
     private boolean isPjSipStackStarted = false;
     ISipClient client;
-    
+
     int clients = 0;
 
     private BroadcastReceiver IncomingReceiver = new BroadcastReceiver() {
@@ -79,13 +79,14 @@
                 try {
                     if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
                         Log.i(TAG, "Received" + intent.getAction());
-                    }else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_LOADED)) {
+                    } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_LOADED)) {
                         Log.i(TAG, "Received" + intent.getAction());
-                    }else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
+                    } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
                         Log.i(TAG, "Received" + intent.getAction());
-                    }
-
-                    if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
+                    } else if(intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
+                        Log.i(TAG, "Received" + intent.getAction());
+                        client.incomingText(intent);
+                    } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
                         Log.i(TAG, "Received" + intent.getAction());
                         client.incomingCall(intent);
                     } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
@@ -127,7 +128,8 @@
         callFilter.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
         callFilter.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
         callFilter.addAction(ConfigurationManagerCallback.ACCOUNTS_LOADED);
-        
+        callFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
+
         LocalBroadcastManager.getInstance(this).registerReceiver(IncomingReceiver, callFilter);
         getExecutor().execute(new StartRunnable());
     }
@@ -438,7 +440,7 @@
             CurrentAudioPlugin runInstance = new CurrentAudioPlugin();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.e(TAG, "Waiting for Nofing");
             }
             return (String) runInstance.getVal();
         }
@@ -456,7 +458,7 @@
             AccountList runInstance = new AccountList();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.e(TAG, "Waiting for Nofing");
             }
             StringVect swigvect = (StringVect) runInstance.getVal();
 
@@ -488,7 +490,7 @@
             getExecutor().execute(runInstance);
             clients++;
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Details "+clients);
+                Log.w(TAG, "Waiting for Details " + clients);
             }
             clients--;
             StringMap swigmap = (StringMap) runInstance.getVal();
@@ -528,14 +530,13 @@
                     return configurationManagerJNI.addAccount(map);
                 }
             }
-            
 
             final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig((HashMap<String, String>) map);
 
             AddAccount runInstance = new AddAccount(swigmap);
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.e(TAG, "Waiting for Nofing");
             }
             String accountId = (String) runInstance.getVal();
 
@@ -573,7 +574,7 @@
             History runInstance = new History();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.w(TAG, "Waiting for getHistory");
             }
             VectMap swigmap = (VectMap) runInstance.getVal();
 
@@ -759,7 +760,7 @@
             ConfList runInstance = new ConfList();
             getExecutor().execute(runInstance);
             while (!runInstance.isDone()) {
-                Log.e(TAG,"Waiting for Nofing");
+                Log.w(TAG, "Waiting for getConferenceList");
             }
             StringVect swigvect = (StringVect) runInstance.getVal();
 
@@ -789,5 +790,61 @@
             return null;
         }
 
+        @Override
+        public String getRecordPath() throws RemoteException {
+            class RecordPath extends SipRunnableWithReturn {
+
+                @Override
+                protected String doRun() throws SameThreadException {
+                    Log.i(TAG, "SipService.getRecordPath() thread running...");
+                    return configurationManagerJNI.getRecordPath();
+                }
+            }
+
+            RecordPath runInstance = new RecordPath();
+            getExecutor().execute(runInstance);
+            while (!runInstance.isDone()) {
+                Log.w(TAG, "Waiting for getRecordPath");
+            }
+            String path = (String) runInstance.getVal();
+
+            return path;
+        }
+
+        @Override
+        public void setRecordingCall(final String id) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.setRecordingCall() thread running...");
+                    callManagerJNI.setRecordingCall(id);
+                }
+            });
+
+        }
+
+        @Override
+        public void setRecordPath(final String path) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.setRecordingCall() thread running...");
+                    configurationManagerJNI.setRecordPath(path);
+                }
+            });
+        }
+
+        @Override
+        public void sendTextMessage(final String callID, final String message, final String from) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.sendTextMessage() thread running...");
+                    callManagerJNI.sendTextMessage(callID, message, from);
+                }
+            });
+
+        }
+
     };
 }