* #26410 Button added in history, replay/stop working
diff --git a/src/com/savoirfairelinux/sflphone/adapters/HistoryAdapter.java b/src/com/savoirfairelinux/sflphone/adapters/HistoryAdapter.java
deleted file mode 100644
index 54cb93c..0000000
--- a/src/com/savoirfairelinux/sflphone/adapters/HistoryAdapter.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package com.savoirfairelinux.sflphone.adapters;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.fragments.HistoryFragment;
-import com.savoirfairelinux.sflphone.model.HistoryEntry;
-
-public class HistoryAdapter extends BaseAdapter {
-
-    HistoryFragment mContext;
-    ArrayList<HistoryEntry> dataset;
-    private static final String TAG = HistoryAdapter.class.getSimpleName();
-    private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
-
-
-
-    public HistoryAdapter(HistoryFragment activity, ArrayList<HistoryEntry> history) {
-        mContext = activity;
-        dataset = history;
-    }
-
-    @Override
-    public View getView(final int pos, View convertView, ViewGroup arg2) {
-        View rowView = convertView;
-        HistoryView entryView = null;
-
-        if (rowView == null) {
-            // Get a new instance of the row layout view
-            LayoutInflater inflater = LayoutInflater.from(mContext.getActivity());
-            rowView = inflater.inflate(R.layout.item_history, null);
-
-            // Hold the view objects in an object
-            // so they don't need to be re-fetched
-            entryView = new HistoryView();
-            entryView.photo = (ImageView) rowView.findViewById(R.id.photo);
-            entryView.displayName = (TextView) rowView.findViewById(R.id.display_name);
-            entryView.duration = (TextView) rowView.findViewById(R.id.duration);
-            entryView.date = (TextView) rowView.findViewById(R.id.date_start);
-            entryView.missed = (TextView) rowView.findViewById(R.id.missed);
-            entryView.incoming = (TextView) rowView.findViewById(R.id.incomings);
-            entryView.outgoing = (TextView) rowView.findViewById(R.id.outgoings);
-            entryView.call_button = (ImageButton) rowView.findViewById(R.id.action_call);
-            entryView.call_button.setOnClickListener(new OnClickListener() {
-                
-                @Override
-                public void onClick(View v) {
-                   mContext.makeNewCall(pos);
-                    
-                }
-            } );
-            rowView.setTag(entryView);
-        } else {
-            entryView = (HistoryView) rowView.getTag();
-        }
-
-        // Transfer the stock data from the data object
-        // to the view objects
-        
-//        SipCall call = (SipCall) mCallList.values().toArray()[position];
-        entryView.displayName.setText(dataset.get(pos).getContact().getmDisplayName());
-        
-        infos_fetcher.execute(new ContactPictureLoader(mContext.getActivity(), entryView.photo, dataset.get(pos).getContact().getId()));
-
-        entryView.missed.setText("Missed:"+dataset.get(pos).getMissed_sum());
-        entryView.incoming.setText("In:"+dataset.get(pos).getIncoming_sum());
-        entryView.outgoing.setText("Out:"+dataset.get(pos).getOutgoing_sum());
-
-        entryView.date.setText(dataset.get(pos).getCalls().lastEntry().getValue().getDate("yyyy-MM-dd"));
-        entryView.duration.setText(dataset.get(pos).getTotalDuration());
-
-
-        return rowView;
-
-    }
-
-    
-
-    /*********************
-     * ViewHolder Pattern
-     *********************/
-    public class HistoryView {
-        public ImageView photo;
-        protected TextView displayName;
-        protected TextView date;
-        public TextView duration;
-        private ImageButton call_button;
-        
-        private TextView missed;
-        private TextView outgoing;
-        private TextView incoming;
-    }
-
-    @Override
-    public int getCount() {
-
-        return dataset.size();
-    }
-
-    @Override
-    public HistoryEntry getItem(int pos) {
-        return dataset.get(pos);
-    }
-
-    @Override
-    public long getItemId(int arg0) {
-        return 0;
-    }
-
-    public void clear() {
-        dataset.clear();
-
-    }
-
-    public void addAll(ArrayList<HashMap<String, String>> history) {
-//        dataset.addAll(history);
-
-    }
-
-}
diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index c1d0826..75ce0c3 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -279,7 +279,10 @@
         mCurrentCallFragment.setArguments(b);
         getFragmentManager().beginTransaction().replace(R.id.ongoingcall_pane, mCurrentCallFragment).commit();
 
-        // onCallResumed(calls);
+        if(calls.size() == 1){
+            onCallResumed(calls.get(0));
+        }
+        
         slidingPaneLayout.setCurFragment(mCurrentCallFragment);
         slidingPaneLayout.closePane();
 
@@ -385,7 +388,7 @@
     public void onRecordCall(SipCall call) {
         try {
             if (call.getCallStateInt() == state.CALL_STATE_CURRENT) {
-                service.setRecordPath(Environment.getExternalStorageDirectory().getAbsolutePath());
+//                service.setRecordPath(Environment.getExternalStorageDirectory().getAbsolutePath());
                 Log.w(TAG, "Recording path" + service.getRecordPath());
                 service.setRecordingCall(call.getCallId());
             }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
index f18b0bf..b79d2a3 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
@@ -50,7 +50,6 @@
 import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.adapters.ContactPictureLoader;
 import com.savoirfairelinux.sflphone.model.Attractor;
 import com.savoirfairelinux.sflphone.model.Bubble;
 import com.savoirfairelinux.sflphone.model.BubbleModel;
@@ -58,6 +57,7 @@
 import com.savoirfairelinux.sflphone.model.CallContact;
 import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.service.ISipService;
+import com.savoirfairelinux.sflphone.views.CounterTextView;
 
 public class CallFragment extends Fragment implements Callback {
 
@@ -68,7 +68,7 @@
 
     private ArrayList<SipCall> mCalls;
 
-    private TextView callStatusTxt;
+    private CounterTextView callStatusTxt;
     private BubblesView view;
     private BubbleModel model;
 
@@ -175,7 +175,7 @@
         // rootView.requestDisallowInterceptTouchEvent(true);
 
         mCallbacks = (Callbacks) activity;
-        myself = SipCall.SipCallBuilder.buildMyselfCall(activity.getContentResolver(), "");
+        myself = SipCall.SipCallBuilder.buildMyselfCall(activity.getContentResolver(), "Me");
 
     }
 
@@ -200,7 +200,7 @@
         view.setModel(model);
         view.getHolder().addCallback(this);
 
-        callStatusTxt = (TextView) rootView.findViewById(R.id.call_status_txt);
+        callStatusTxt = (CounterTextView) rootView.findViewById(R.id.call_status_txt);
 
         hangup_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hangup);
         call_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_call);
@@ -227,24 +227,24 @@
         }
 
         model.clearAttractors();
-        model.addAttractor(new Attractor(new PointF(model.width / 1.1f, model.height * .1f), ATTRACTOR_SIZE, new Attractor.Callback() {
-            @Override
-            public boolean onBubbleSucked(Bubble b) {
-                Log.w(TAG, "Bubble sucked ! ");
-                if (mCalls.size() == 1) {
-                    mCallbacks.onCallEnded(b.associated_call);
-                } else {
-                    try {
-                        mCallbacks.getService().detachParticipant(b.associated_call.getCallId());
-                    } catch (RemoteException e) {
-                        e.printStackTrace();
-                    }
-                }
-
-                bubbleRemoved(b);
-                return true;
-            }
-        }, hangup_icon));
+//        model.addAttractor(new Attractor(new PointF(model.width / 1.1f, model.height * .1f), ATTRACTOR_SIZE, new Attractor.Callback() {
+//            @Override
+//            public boolean onBubbleSucked(Bubble b) {
+//                Log.w(TAG, "Bubble sucked ! ");
+//                if (mCalls.size() == 1) {
+//                    mCallbacks.onCallEnded(b.associated_call);
+//                } else {
+//                    try {
+//                        mCallbacks.getService().detachParticipant(b.associated_call.getCallId());
+//                    } catch (RemoteException e) {
+//                        e.printStackTrace();
+//                    }
+//                }
+//
+//                bubbleRemoved(b);
+//                return true;
+//            }
+//        }, hangup_icon));
 
     }
 
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
index 9ea78ee..b8eba9f 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
@@ -345,6 +345,10 @@
 
             if (convertView == null)
                 convertView = LayoutInflater.from(mContext).inflate(R.layout.expandable_child, null);
+            
+            convertView.setAnimation(AnimationUtils.loadAnimation(getActivity(), R.animator.slide_down));
+            
+            
 
             ((ImageButton) convertView.findViewById(R.id.action_hangup)).setOnClickListener(new OnClickListener() {
 
@@ -435,6 +439,7 @@
             // as new group to expand
             if (groupPosition != lastExpandedGroupPosition) {
                 list.collapseGroup(lastExpandedGroupPosition);
+                
             }
 
             super.onGroupExpanded(groupPosition);
diff --git a/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java b/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java
index e141b5b..8a2e0a2 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/HistoryFragment.java
@@ -32,6 +32,8 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 import android.app.Activity;
 import android.app.ListFragment;
@@ -42,18 +44,22 @@
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.AdapterView;
-import android.widget.ListView;
 import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
 
 import com.savoirfairelinux.sflphone.R;
-import com.savoirfairelinux.sflphone.adapters.HistoryAdapter;
+import com.savoirfairelinux.sflphone.adapters.ContactPictureLoader;
 import com.savoirfairelinux.sflphone.loaders.HistoryLoader;
 import com.savoirfairelinux.sflphone.loaders.LoaderConstants;
-import com.savoirfairelinux.sflphone.model.CallContact;
 import com.savoirfairelinux.sflphone.model.HistoryEntry;
-import com.savoirfairelinux.sflphone.model.SipCall;
 import com.savoirfairelinux.sflphone.service.ISipService;
 
 public class HistoryFragment extends ListFragment implements LoaderCallbacks<ArrayList<HistoryEntry>> {
@@ -140,7 +146,7 @@
         HistoryLoader loader = new HistoryLoader(getActivity(), mCallbacks.getService());
         loader.forceLoad();
         return loader;
-        
+
     }
 
     @Override
@@ -157,4 +163,137 @@
 
     }
 
+    public class HistoryAdapter extends BaseAdapter {
+
+        HistoryFragment mContext;
+        ArrayList<HistoryEntry> dataset;
+        private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
+
+        public HistoryAdapter(HistoryFragment activity, ArrayList<HistoryEntry> history) {
+            mContext = activity;
+            dataset = history;
+        }
+
+        @Override
+        public View getView(final int pos, View convertView, ViewGroup arg2) {
+            View rowView = convertView;
+            HistoryView entryView = null;
+
+            if (rowView == null) {
+                // Get a new instance of the row layout view
+                LayoutInflater inflater = LayoutInflater.from(mContext.getActivity());
+                rowView = inflater.inflate(R.layout.item_history, null);
+
+                // Hold the view objects in an object
+                // so they don't need to be re-fetched
+                entryView = new HistoryView();
+                entryView.photo = (ImageView) rowView.findViewById(R.id.photo);
+                entryView.displayName = (TextView) rowView.findViewById(R.id.display_name);
+                entryView.duration = (TextView) rowView.findViewById(R.id.duration);
+                entryView.date = (TextView) rowView.findViewById(R.id.date_start);
+                entryView.missed = (TextView) rowView.findViewById(R.id.missed);
+                entryView.incoming = (TextView) rowView.findViewById(R.id.incomings);
+                entryView.outgoing = (TextView) rowView.findViewById(R.id.outgoings);
+                entryView.replay = (Button) rowView.findViewById(R.id.replay);
+                entryView.call_button = (ImageButton) rowView.findViewById(R.id.action_call);
+                entryView.call_button.setOnClickListener(new OnClickListener() {
+
+                    @Override
+                    public void onClick(View v) {
+                        mContext.makeNewCall(pos);
+
+                    }
+                });
+                rowView.setTag(entryView);
+            } else {
+                entryView = (HistoryView) rowView.getTag();
+            }
+
+            // Transfer the stock data from the data object
+            // to the view objects
+
+            // SipCall call = (SipCall) mCallList.values().toArray()[position];
+            entryView.displayName.setText(dataset.get(pos).getContact().getmDisplayName());
+
+            infos_fetcher.execute(new ContactPictureLoader(mContext.getActivity(), entryView.photo, dataset.get(pos).getContact().getId()));
+
+            entryView.missed.setText("Missed:" + dataset.get(pos).getMissed_sum());
+            entryView.incoming.setText("In:" + dataset.get(pos).getIncoming_sum());
+            entryView.outgoing.setText("Out:" + dataset.get(pos).getOutgoing_sum());
+
+            if (dataset.get(pos).getCalls().lastEntry().getValue().getRecordPath().length() > 0) {
+                entryView.replay.setVisibility(View.VISIBLE);
+                entryView.replay.setTag(R.id.replay, true);
+                entryView.replay.setOnClickListener(new OnClickListener() {
+
+                    @Override
+                    public void onClick(View v) {
+                        try {
+                            if ((Boolean) v.getTag(R.id.replay)) {
+                                mCallbacks.getService().startRecordedFilePlayback(dataset.get(pos).getCalls().lastEntry().getValue().getRecordPath());
+                                v.setTag(R.id.replay, false);
+                                ((Button)v).setText("Stop");
+                            } else {
+                                mCallbacks.getService().stopRecordedFilePlayback(dataset.get(pos).getCalls().lastEntry().getValue().getRecordPath());
+                                v.setTag(R.id.replay, true);
+                                ((Button)v).setText("Replay");
+                            }
+                        } catch (RemoteException e) {
+                            // TODO Auto-generated catch block
+                            e.printStackTrace();
+                        }
+                    }
+                });
+            }
+
+            entryView.date.setText(dataset.get(pos).getCalls().lastEntry().getValue().getDate("yyyy-MM-dd"));
+            entryView.duration.setText(dataset.get(pos).getTotalDuration());
+
+            return rowView;
+
+        }
+
+        /*********************
+         * ViewHolder Pattern
+         *********************/
+        public class HistoryView {
+            public ImageView photo;
+            protected TextView displayName;
+            protected TextView date;
+            public TextView duration;
+            private ImageButton call_button;
+            private Button replay;
+            private TextView missed;
+            private TextView outgoing;
+            private TextView incoming;
+        }
+
+        @Override
+        public int getCount() {
+
+            return dataset.size();
+        }
+
+        @Override
+        public HistoryEntry getItem(int pos) {
+            return dataset.get(pos);
+        }
+
+        @Override
+        public long getItemId(int arg0) {
+            return 0;
+        }
+
+        public void clear() {
+            dataset.clear();
+
+        }
+
+        public void addAll(ArrayList<HashMap<String, String>> history) {
+            // dataset.addAll(history);
+
+        }
+
+    }
+
 }
diff --git a/src/com/savoirfairelinux/sflphone/loaders/HistoryLoader.java b/src/com/savoirfairelinux/sflphone/loaders/HistoryLoader.java
index 8448d63..52120f6 100644
--- a/src/com/savoirfairelinux/sflphone/loaders/HistoryLoader.java
+++ b/src/com/savoirfairelinux/sflphone/loaders/HistoryLoader.java
@@ -39,7 +39,7 @@
 
         historyEntries = new HashMap<String, HistoryEntry>();
 
-        if(service == null){
+        if (service == null) {
             return new ArrayList<HistoryEntry>();
         }
         try {
@@ -53,18 +53,22 @@
                 String call_state = entry.get(ServiceConstants.HISTORY_STATE_KEY);
 
                 String number_called = entry.get(ServiceConstants.HISTORY_PEER_NUMBER_KEY);
+
+                Log.w(TAG, "----------------------Record" + entry.get(ServiceConstants.HISTORY_RECORDING_PATH_KEY));
                 CallContact c = null;
                 if (historyEntries.containsKey(number_called)) {
-                    historyEntries.get(number_called).addHistoryCall(new HistoryCall(timestampStart, timestampEnd, number_called, call_state));
+                    historyEntries.get(number_called).addHistoryCall(
+                            new HistoryCall(timestampStart, timestampEnd, number_called, call_state, entry
+                                    .get(ServiceConstants.HISTORY_RECORDING_PATH_KEY)));
                 } else {
 
                     Pattern p = Pattern.compile("<sip:([^@]+)@([^>]+)>");
                     Matcher m = p.matcher(number_called);
                     if (m.find()) {
-                        String s1 = m.group(1);
-                        System.out.println(s1);
-                        String s2 = m.group(2);
-                        System.out.println(s2);
+                        // String s1 = m.group(1);
+                        // System.out.println(s1);
+                        // String s2 = m.group(2);
+                        // System.out.println(s2);
 
                         Cursor result = getContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                                 ContactsContract.CommonDataKinds.Phone.NUMBER + " = " + m.group(1), null, null);
@@ -84,7 +88,8 @@
                         c = ContactBuilder.buildUnknownContact(number_called);
                     }
                     HistoryEntry e = new HistoryEntry(entry.get(ServiceConstants.HISTORY_ACCOUNT_ID_KEY), c);
-                    e.addHistoryCall(new HistoryCall(timestampStart, timestampEnd, number_called, call_state));
+                    e.addHistoryCall(new HistoryCall(timestampStart, timestampEnd, number_called, call_state, entry
+                            .get(ServiceConstants.HISTORY_RECORDING_PATH_KEY)));
                     historyEntries.put(number_called, e);
                 }
 
diff --git a/src/com/savoirfairelinux/sflphone/model/Bubble.java b/src/com/savoirfairelinux/sflphone/model/Bubble.java
index de69770..420fb6a 100644
--- a/src/com/savoirfairelinux/sflphone/model/Bubble.java
+++ b/src/com/savoirfairelinux/sflphone/model/Bubble.java
@@ -125,13 +125,7 @@
     boolean intersects(float x, float y) {
         float dx = x - pos.x;
         float dy = y - pos.y;
-        Log.i("Bubble","dx:"+dx);
-        Log.i("Bubble","dy:"+dy);
-        Log.i("Bubble", "Intersection dx²+dy²="+(dx * dx + dy * dy));
-        Log.i("Bubble", "Intersection getRadius²="+getRadius() * getRadius());
-        
-        Log.i("Bubble","pos.x:"+pos.x);
-        Log.i("Bubble","pos.y:"+pos.y);
+
         return dx * dx + dy * dy < getRadius() * density * getRadius() * density;
     }
 
diff --git a/src/com/savoirfairelinux/sflphone/model/BubblesView.java b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
index 26103fb..f365ec2 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubblesView.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
@@ -292,8 +292,11 @@
     }

 

     private Paint getNamePaint(Bubble b) {

-        if (b.expanded)

+        if (b.expanded) {

+            white_name_paint.setTextSize(15 * b.target_scale * textDensity);

             return white_name_paint;

+        }

+        black_name_paint.setTextSize(18 * b.target_scale * textDensity);

         return black_name_paint;

     }

 

@@ -340,7 +343,6 @@
         }

         return null;

     }

-    

 

     class MyOnGestureListener implements OnGestureListener {

         @Override

@@ -353,15 +355,21 @@
                     expand.retract();

                 } else {

                     Log.d("Main", "getAction");

-                    switch(expand.getAction(event.getX(), event.getY())){

-                    case 0: expand.retract();

-                    break;

-                    case 1: Log.d("Main", "onCallSuspended");((CallActivity)callback.getActivity()).onCallSuspended(expand.associated_call);

-                    break;

-                    case 2: Log.d("Main", "onRecordCall");((CallActivity)callback.getActivity()).onRecordCall(expand.associated_call);

-                    break;

-                    case 3: Toast.makeText(getContext(), "Not implemented here",Toast.LENGTH_SHORT).show();

-                    break;

+                    switch (expand.getAction(event.getX(), event.getY())) {

+                    case 0:

+                        expand.retract();

+                        break;

+                    case 1:

+                        Log.d("Main", "onCallSuspended");

+                        ((CallActivity) callback.getActivity()).onCallSuspended(expand.associated_call);

+                        break;

+                    case 2:

+                        Log.d("Main", "onRecordCall");

+                        ((CallActivity) callback.getActivity()).onRecordCall(expand.associated_call);

+                        break;

+                    case 3:

+                        Toast.makeText(getContext(), "Not implemented here", Toast.LENGTH_SHORT).show();

+                        break;

                     }

                 }

                 return true;

@@ -379,8 +387,6 @@
             }

             return true;

         }

-        

-        

 

         @Override

         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

@@ -422,15 +428,9 @@
                     float dt = (float) ((now - b.last_drag) / 1000000000.);

                     float dx = x - b.getPosX(), dy = y - b.getPosY();

                     b.last_drag = now;

-

                     b.setPos(event.getX(), event.getY());

-                    /*

-                     * int hn = event.getHistorySize() - 2; Log.w(TAG, "event.getHistorySize() : " + event.getHistorySize()); if(hn > 0) { float dx =

-                     * x-event.getHistoricalX(hn); float dy = y-event.getHistoricalY(hn); float dt = event.getHistoricalEventTime(hn)/1000.f;

-                     */

                     b.speed.x = dx / dt;

                     b.speed.y = dy / dt;

-                    // Log.w(TAG, "onTouch dx:" + b.speed.x + " dy:" + b.speed.y);

                     // }

                     return true;

                 }

@@ -460,7 +460,7 @@
 

     public void setFragment(CallFragment callFragment) {

         callback = callFragment;

-        

+

     }

 

 }

diff --git a/src/com/savoirfairelinux/sflphone/model/HistoryEntry.java b/src/com/savoirfairelinux/sflphone/model/HistoryEntry.java
index 8809e2e..860bc16 100644
--- a/src/com/savoirfairelinux/sflphone/model/HistoryEntry.java
+++ b/src/com/savoirfairelinux/sflphone/model/HistoryEntry.java
@@ -45,16 +45,18 @@
         long call_end;
         String number;
         String state;
+        String recordPath;
 
         public String getState() {
             return state;
         }
 
-        public HistoryCall(long start, long end, String n, String s) {
+        public HistoryCall(long start, long end, String n, String s, String path) {
             call_start = start;
             call_end = end;
             number = n;
             state = s;
+            recordPath = path;
         }
 
         public String getDate(String format) {
@@ -84,6 +86,14 @@
 
         }
 
+        public String getRecordPath() {
+            return recordPath;
+        }
+
+        public void setRecordPath(String recordPath) {
+            this.recordPath = recordPath;
+        }
+
     }
 
     public CallContact getContact() {
diff --git a/src/com/savoirfairelinux/sflphone/model/SipCall.java b/src/com/savoirfairelinux/sflphone/model/SipCall.java
index 6b9da85..2e7018d 100644
--- a/src/com/savoirfairelinux/sflphone/model/SipCall.java
+++ b/src/com/savoirfairelinux/sflphone/model/SipCall.java
@@ -45,6 +45,8 @@
     private String mCallID = "";
     private String mAccountID = "";
     private CallContact contact = null;
+    
+    public static final String USER_ID = "user_id";
 
     private int mCallType = state.CALL_TYPE_UNDETERMINED;
     private int mCallState = state.CALL_STATE_NONE;
@@ -52,7 +54,6 @@
 
     /************************
      * Construtors
-     * 
      ***********************/
 
     private SipCall(Parcel in) {
diff --git a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
index 15569b8..3a6cb3c 100644
--- a/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
+++ b/src/com/savoirfairelinux/sflphone/service/ISipService.aidl
@@ -32,6 +32,8 @@
     void setRecordPath(in String path);
     String getRecordPath();
     void setRecordingCall(in String id);
+    boolean startRecordedFilePlayback(in String filepath);
+	void stopRecordedFilePlayback(in String filepath);
     
     /* IM */
     void sendTextMessage(in String callID, in String message, in String from);
diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java
index 9f1c193..94afa54 100644
--- a/src/com/savoirfairelinux/sflphone/service/SipService.java
+++ b/src/com/savoirfairelinux/sflphone/service/SipService.java
@@ -878,6 +878,29 @@
             });
 
         }
+        
+        @Override
+        public boolean startRecordedFilePlayback(final String filepath) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.setRecordingCall() thread running...");
+                    callManagerJNI.startRecordedFilePlayback(filepath);
+                }
+            });
+            return false;
+        }
+
+        @Override
+        public void stopRecordedFilePlayback(final String filepath) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.stopRecordedFilePlayback() thread running...");
+                    callManagerJNI.stopRecordedFilePlayback(filepath);
+                }
+            });
+        }
 
         @Override
         public void setRecordPath(final String path) throws RemoteException {
@@ -1002,8 +1025,9 @@
         public void removeNotification() {
             NotificationManager nm = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
             nm.cancel(NOTIFICATION_ID);
-
         }
 
+
+
     };
 }
diff --git a/src/com/savoirfairelinux/sflphone/views/CounterTextView.java b/src/com/savoirfairelinux/sflphone/views/CounterTextView.java
new file mode 100644
index 0000000..251d9cb
--- /dev/null
+++ b/src/com/savoirfairelinux/sflphone/views/CounterTextView.java
@@ -0,0 +1,34 @@
+package com.savoirfairelinux.sflphone.views;
+
+import java.util.Observable;
+import java.util.Observer;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.widget.TextView;
+
+public class CounterTextView extends TextView implements Observer {
+
+    public CounterTextView(Context context) {
+        super(context);
+        // TODO Auto-generated constructor stub
+    }
+
+    public CounterTextView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        // TODO Auto-generated constructor stub
+    }
+
+    public CounterTextView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+
+    }
+
+    @Override
+    public void update(Observable observable, Object data) {
+        Log.i("TextView", "updating");
+
+    }
+
+}