* #29743 modified config.h of libsnd, UI adjustements
diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 9c2c0c3..5f5d78b 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -412,8 +412,8 @@
     public void onRecordCall(SipCall call) {
         try {
 
-            service.setRecordPath(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator);
-            Log.w(TAG, "Recording path" + service.getRecordPath());
+//            service.setRecordPath(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator);
+            Log.w(TAG, "Recording path " + service.getRecordPath());
             service.toggleRecordingCall(call.getCallId());
 
         } catch (RemoteException e) {
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
index a7c22ee..7dd4f0e 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallFragment.java
@@ -31,8 +31,12 @@
 
 package com.savoirfairelinux.sflphone.fragments;
 
+import java.util.ArrayList;
+
 import android.app.Activity;
 import android.app.Fragment;
+import android.app.FragmentManager;
+import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.PointF;
@@ -63,6 +67,8 @@
     float BUBBLE_SIZE = 75;
     static final float ATTRACTOR_SIZE = 40;
 
+    public static final int REQUEST_TRANSFER = 10;
+
     private Conference conf;
 
     private CounterTextView callStatusTxt;
@@ -75,7 +81,7 @@
 
     boolean accepted = false;
 
-    private Bitmap hangup_icon, separate_icon;
+    private Bitmap hangup_icon, transfer_icon;
     private Bitmap call_icon;
 
     @Override
@@ -196,6 +202,45 @@
     }
 
     @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        SipCall transfer = null;
+        if (requestCode == REQUEST_TRANSFER) {
+            switch (resultCode) {
+            case 0:
+                Conference c = data.getParcelableExtra("target");
+                transfer = data.getParcelableExtra("transfer");
+                try {
+
+                    mCallbacks.getService().attendedTransfer(transfer.getCallId(), c.getParticipants().get(0).getCallId());
+
+                } catch (RemoteException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+                Toast.makeText(getActivity(), "Transfer complete", Toast.LENGTH_LONG).show();
+                break;
+
+            case 1:
+                String to = data.getStringExtra("to_number");
+                transfer = data.getParcelableExtra("transfer");
+                try {
+                    Toast.makeText(getActivity(), "Transferring " + transfer.getContact().getmDisplayName() + " to " + to, Toast.LENGTH_SHORT).show();
+                    mCallbacks.getService().transfer(transfer.getCallId(), to);
+                    mCallbacks.getService().hangUp(transfer.getCallId());
+                } catch (RemoteException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+                break;
+
+            default:
+                break;
+            }
+        }
+    }
+
+    @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.frag_call, container, false);
 
@@ -208,7 +253,7 @@
 
         hangup_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hangup);
         call_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_call);
-        separate_icon = BitmapFactory.decodeResource(getResources(), R.drawable.icon_separate);
+        transfer_icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_phones_call_transfer_icon);
 
         // Do nothing here, the view is not initialized yet.
         return rootView;
@@ -237,7 +282,7 @@
         }
 
         model.clearAttractors();
-        model.addAttractor(new Attractor(new PointF(model.width / 2f, model.height * 0.9f), ATTRACTOR_SIZE, new Attractor.Callback() {
+        model.addAttractor(new Attractor(new PointF(model.width * .2f, model.height * 0.9f), ATTRACTOR_SIZE, new Attractor.Callback() {
             @Override
             public boolean onBubbleSucked(Bubble b) {
                 Log.w(TAG, "Bubble sucked ! ");
@@ -249,6 +294,8 @@
                             mCallbacks.getService().hangUpConference(conf.getId());
                         else
                             mCallbacks.onCallEnded(conf.getParticipants().get(0));
+
+                        model.clearAttractors();
                     } catch (RemoteException e) {
                         e.printStackTrace();
                     }
@@ -261,6 +308,15 @@
             }
         }, hangup_icon));
 
+        model.addAttractor(new Attractor(new PointF(model.width * .8f, model.height * 0.9f), ATTRACTOR_SIZE, new Attractor.Callback() {
+            @Override
+            public boolean onBubbleSucked(Bubble b) {
+                Log.w(TAG, "Bubble sucked ! ");
+                makeTransfer(b);
+                return true;
+            }
+        }, transfer_icon));
+
         // if (conf.hasMultipleParticipants()) {
         // model.addAttractor(new Attractor(new PointF(model.width / 1.1f, model.height * .9f), ATTRACTOR_SIZE, new Attractor.Callback() {
         // @Override
@@ -332,6 +388,7 @@
         }
 
         model.clearAttractors();
+
         model.addAttractor(new Attractor(new PointF(model.width / 2f, model.height * .9f), 40, new Attractor.Callback() {
             @Override
             public boolean onBubbleSucked(Bubble b) {
@@ -453,6 +510,19 @@
 
     }
 
+    public void makeTransfer(Bubble contact) {
+        FragmentManager fm = getFragmentManager();
+        TransferDFragment editName = new TransferDFragment();
+
+        Bundle b = new Bundle();
+        b.putParcelableArrayList("calls", new ArrayList<Conference>());
+        b.putParcelable("call_selected", contact.associated_call);
+        editName.setArguments(b);
+        editName.setTargetFragment(this, REQUEST_TRANSFER);
+        editName.show(fm, "");
+
+    }
+
     @Override
     public void surfaceCreated(SurfaceHolder holder) {
     }
@@ -465,5 +535,4 @@
         return view;
 
     }
-
 }
diff --git a/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
index 4b3f516..d31cfb7 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/CallListFragment.java
@@ -489,13 +489,13 @@
             if (call.getParticipants().size() == 1) {
                 ((TextView) convertView.findViewById(R.id.call_title)).setText(call.getParticipants().get(0).getContact().getmDisplayName());
             } else {
-                String tmp = "Conference with "+ call.getParticipants().size()+" participants";
-//                for (SipCall c : call.getParticipants()) {
-//                    tmp += c.getContact().getmDisplayName() + " ";
-//                }
+                String tmp = "Conference with " + call.getParticipants().size() + " participants";
+                // for (SipCall c : call.getParticipants()) {
+                // tmp += c.getContact().getmDisplayName() + " ";
+                // }
                 ((TextView) convertView.findViewById(R.id.call_title)).setText(tmp);
             }
-//            ((TextView) convertView.findViewById(R.id.num_participants)).setText("" + call.getParticipants().size());
+            // ((TextView) convertView.findViewById(R.id.num_participants)).setText("" + call.getParticipants().size());
             ((TextView) convertView.findViewById(R.id.call_status)).setText(call.getState());
             convertView.setOnDragListener(dragListener);
 
diff --git a/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java b/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java
index c410211..904bb1a 100644
--- a/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java
+++ b/src/com/savoirfairelinux/sflphone/fragments/TransferDFragment.java
@@ -67,7 +67,7 @@
         View rootView = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_transfer, null);
 
         ArrayList<Conference> calls = getArguments().getParcelableArrayList("calls");
-        final Conference call_selected = getArguments().getParcelable("call_selected");
+        final SipCall call_selected = getArguments().getParcelable("call_selected");
 
         mAdapter = new SimpleCallListAdapter(getActivity(), calls);
         ListView list = (ListView) rootView.findViewById(R.id.concurrent_calls);
@@ -90,7 +90,7 @@
         mEditText.setAdapter(autoCompleteAdapter);
 
         final AlertDialog a = new AlertDialog.Builder(getActivity()).setView(rootView)
-                .setTitle("Transfer " + call_selected.getParticipants().get(0).getContact().getmDisplayName())
+                .setTitle("Transfer " + call_selected.getContact().getmDisplayName())
                 .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int whichButton) {
                         
diff --git a/src/com/savoirfairelinux/sflphone/model/BubblesView.java b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
index a29d8ab..235b680 100644
--- a/src/com/savoirfairelinux/sflphone/model/BubblesView.java
+++ b/src/com/savoirfairelinux/sflphone/model/BubblesView.java
@@ -404,6 +404,7 @@
                         ((CallActivity) callback.getActivity()).onRecordCall(expand.associated_call);

                         break;

                     case 3:

+                        callback.makeTransfer(expand);

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

                         break;

                     }