* #31230: improved swipe detection and scroll
diff --git a/src/org/sflphone/adapters/ContactsAdapter.java b/src/org/sflphone/adapters/ContactsAdapter.java
index 57ab39a..83492f9 100644
--- a/src/org/sflphone/adapters/ContactsAdapter.java
+++ b/src/org/sflphone/adapters/ContactsAdapter.java
@@ -110,6 +110,14 @@
             }
         });
         
+        entryView.quick_msg.setOnClickListener(new OnClickListener() {
+
+            @Override
+            public void onClick(View v) {
+                parent.get().mCallbacks.onTextContact(item);
+            }
+        });
+        
         entryView.quick_starred.setOnClickListener(new OnClickListener() {
 
             @Override
@@ -136,15 +144,9 @@
             }
         });
         
-        
-
-        entryView.quick_msg.setOnClickListener(new OnClickListener() {
-
-            @Override
-            public void onClick(View v) {
-                parent.get().mCallbacks.onTextContact(item);
-            }
-        });
+        entryView.quick_edit.setClickable(false);
+        entryView.quick_discard.setClickable(false);
+        entryView.quick_starred.setClickable(false);
 
         return convertView;
     }
diff --git a/src/org/sflphone/fragments/CallListFragment.java b/src/org/sflphone/fragments/CallListFragment.java
index 3d39265..1289364 100644
--- a/src/org/sflphone/fragments/CallListFragment.java
+++ b/src/org/sflphone/fragments/CallListFragment.java
@@ -150,54 +150,54 @@
         list.setDividerHeight(10);
         list.setAdapter(mAdapter);
         list.setOnItemClickListener(mItemClickListener);
-        list.setOnTouchListener(new SwipeListViewTouchListener(list, new SwipeListViewTouchListener.OnSwipeCallback() {
-            @Override
-            public void onSwipeLeft(ListView listView, int[] reverseSortedPositions) {
-                // Log.i(this.getClass().getName(), "swipe left : pos="+reverseSortedPositions[0]);
-                // TODO : YOUR CODE HERE FOR LEFT ACTION
-                Conference tmp = mAdapter.getItem(reverseSortedPositions[0]);
-                try {
-                    if (tmp.hasMultipleParticipants()) {
-                        mCallbacks.getService().hangUpConference(tmp.getId());
-                    } else {
-                        mCallbacks.getService().hangUp(tmp.getParticipants().get(0).getCallId());
-                    }
-                } catch (RemoteException e) {
-                    // TODO Auto-generated catch block
-                    e.printStackTrace();
-                }
-
-            }
-
-            @Override
-            public void onSwipeRight(ListView listView, int[] reverseSortedPositions) {
-                // Log.i(ProfileMenuActivity.class.getClass().getName(), "swipe right : pos="+reverseSortedPositions[0]);
-                // TODO : YOUR CODE HERE FOR RIGHT ACTION
-
-                Conference tmp = mAdapter.getItem(reverseSortedPositions[0]);
-                try {
-                    if (tmp.hasMultipleParticipants()) {
-                        if (tmp.isOnHold()) {
-                            mCallbacks.getService().unholdConference(tmp.getId());
-                        } else {
-                            mCallbacks.getService().holdConference(tmp.getId());
-                        }
-                    } else {
-                        if (tmp.isOnHold()) {
-                            Toast.makeText(getActivity(), "call is on hold,  unholding", Toast.LENGTH_SHORT).show();
-                            mCallbacks.getService().unhold(tmp.getParticipants().get(0).getCallId());
-                        } else {
-                            Toast.makeText(getActivity(), "call is current,  holding", Toast.LENGTH_SHORT).show();
-                            mCallbacks.getService().hold(tmp.getParticipants().get(0).getCallId());
-                        }
-                    }
-                } catch (RemoteException e) {
-                    // TODO Auto-generated catch block
-                    e.printStackTrace();
-                }
-            }
-        }, true, // example : left action = dismiss
-                false)); // example : right action without dismiss animation);
+//        list.setOnTouchListener(new SwipeListViewTouchListener(list, new SwipeListViewTouchListener.OnSwipeCallback() {
+//            @Override
+//            public void onSwipeLeft(ListView listView, int[] reverseSortedPositions) {
+//                // Log.i(this.getClass().getName(), "swipe left : pos="+reverseSortedPositions[0]);
+//                // TODO : YOUR CODE HERE FOR LEFT ACTION
+//                Conference tmp = mAdapter.getItem(reverseSortedPositions[0]);
+//                try {
+//                    if (tmp.hasMultipleParticipants()) {
+//                        mCallbacks.getService().hangUpConference(tmp.getId());
+//                    } else {
+//                        mCallbacks.getService().hangUp(tmp.getParticipants().get(0).getCallId());
+//                    }
+//                } catch (RemoteException e) {
+//                    // TODO Auto-generated catch block
+//                    e.printStackTrace();
+//                }
+//
+//            }
+//
+//            @Override
+//            public void onSwipeRight(ListView listView, int[] reverseSortedPositions) {
+//                // Log.i(ProfileMenuActivity.class.getClass().getName(), "swipe right : pos="+reverseSortedPositions[0]);
+//                // TODO : YOUR CODE HERE FOR RIGHT ACTION
+//
+//                Conference tmp = mAdapter.getItem(reverseSortedPositions[0]);
+//                try {
+//                    if (tmp.hasMultipleParticipants()) {
+//                        if (tmp.isOnHold()) {
+//                            mCallbacks.getService().unholdConference(tmp.getId());
+//                        } else {
+//                            mCallbacks.getService().holdConference(tmp.getId());
+//                        }
+//                    } else {
+//                        if (tmp.isOnHold()) {
+//                            Toast.makeText(getActivity(), "call is on hold,  unholding", Toast.LENGTH_SHORT).show();
+//                            mCallbacks.getService().unhold(tmp.getParticipants().get(0).getCallId());
+//                        } else {
+//                            Toast.makeText(getActivity(), "call is current,  holding", Toast.LENGTH_SHORT).show();
+//                            mCallbacks.getService().hold(tmp.getParticipants().get(0).getCallId());
+//                        }
+//                    }
+//                } catch (RemoteException e) {
+//                    // TODO Auto-generated catch block
+//                    e.printStackTrace();
+//                }
+//            }
+//        }, true, // example : left action = dismiss
+//                false)); // example : right action without dismiss animation);
         list.setOnItemLongClickListener(mItemLongClickListener);
 
         return rootView;
diff --git a/src/org/sflphone/fragments/ContactListFragment.java b/src/org/sflphone/fragments/ContactListFragment.java
index 939b325..848afff 100644
--- a/src/org/sflphone/fragments/ContactListFragment.java
+++ b/src/org/sflphone/fragments/ContactListFragment.java
@@ -183,9 +183,10 @@
             }
 
             @Override
-            public void onSwipeRight(ListView listView, final int[] reverseSortedPositions) {
-                // Log.i(ProfileMenuActivity.class.getClass().getName(), "swipe right : pos="+reverseSortedPositions[0]);
-                // TODO : YOUR CODE HERE FOR RIGHT ACTION
+            public void onSwipeRight(ListView listView, View down) {
+                down.findViewById(R.id.quick_edit).setClickable(true);
+                down.findViewById(R.id.quick_discard).setClickable(true);
+                down.findViewById(R.id.quick_starred).setClickable(true);
                 
             }
         }, true, false));
diff --git a/src/org/sflphone/views/SwipeListViewTouchListener.java b/src/org/sflphone/views/SwipeListViewTouchListener.java
index 38125b9..0ae0207 100644
--- a/src/org/sflphone/views/SwipeListViewTouchListener.java
+++ b/src/org/sflphone/views/SwipeListViewTouchListener.java
@@ -18,6 +18,7 @@
 import android.view.ViewGroup;
 import android.widget.AbsListView;
 import android.widget.ListView;
+import android.widget.Toast;
 
 public class SwipeListViewTouchListener implements View.OnTouchListener {
     // Cached ViewConfiguration and system-wide constant values
@@ -43,7 +44,7 @@
     private boolean mSwiping;
     private VelocityTracker mVelocityTracker;
     private int mDownPosition;
-    private View mDownView;
+    private View mDownView, mUnderDownView;
     private boolean mPaused;
 
     /**
@@ -61,7 +62,7 @@
          */
         void onSwipeLeft(ListView listView, int[] reverseSortedPositions);
 
-        void onSwipeRight(ListView listView, int[] reverseSortedPositions);
+        void onSwipeRight(ListView listView, View downView);
     }
 
     /**
@@ -161,6 +162,7 @@
                 child.getHitRect(rect);
                 if (rect.contains(x, y)) {
                     mDownView = child.findViewById(R.id.contactview);
+                    mUnderDownView = child.findViewById(R.id.contact_underview);
                     break;
                 }
             }
@@ -174,6 +176,7 @@
                 mVelocityTracker.addMovement(motionEvent);
                 mVelocityTracker.recycle();
             }
+            Log.i(TAG, "item id "+item.getId());
             item.onTouchEvent(motionEvent);
             return true;
         }
@@ -192,7 +195,7 @@
             boolean swipe = false;
             boolean swipeRight = false;
 
-            if (Math.abs(deltaX) > mViewWidth / 2) {
+            if (mDownView.getTranslationX() > mViewWidth / 2) {
                 swipe = true;
                 swipeRight = deltaX > 0;
             } else if (mMinFlingVelocity <= velocityX && velocityX <= mMaxFlingVelocity && velocityY < velocityX) {
@@ -211,7 +214,8 @@
                         @Override
                         public void onAnimationEnd(Animator animation) {
                             mListView.requestDisallowInterceptTouchEvent(false);
-//                            mCallback.onSwipeRight(mListView, swipePositions);
+//                            mCallback.onSwipeRight(mListView, mUnderDownView);
+                            toggleUnderLayerState(true);
 //                             performSwipeAction(downView, downPosition, toTheRight,dismissRight);
                         }
                     });
@@ -221,7 +225,13 @@
 
             } else {
                 // cancel
-                mDownView.animate().translationX(0).alpha(1).setDuration(mAnimationTime).setListener(null);
+                mDownView.animate().translationX(0).alpha(1).setDuration(mAnimationTime).setListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        toggleUnderLayerState(false);
+                        mUnderDownView = null;
+                    }
+                });
             }
             mVelocityTracker = null;
             mDownX = 0;
@@ -268,6 +278,14 @@
         }
         return false;
     }
+    
+    private void toggleUnderLayerState(boolean b) {
+        if(mUnderDownView == null)
+            return;
+        mUnderDownView.findViewById(R.id.quick_edit).setClickable(b);
+        mUnderDownView.findViewById(R.id.quick_discard).setClickable(b);
+        mUnderDownView.findViewById(R.id.quick_starred).setClickable(b);
+    }
 
     class PendingSwipeData implements Comparable<PendingSwipeData> {
         public int position;
@@ -313,10 +331,10 @@
                     for (int i = mPendingSwipes.size() - 1; i >= 0; i--) {
                         swipePositions[i] = mPendingSwipes.get(i).position;
                     }
-                    if (swipeRight)
-                        mCallback.onSwipeRight(mListView, swipePositions);
-                    else
-                        mCallback.onSwipeLeft(mListView, swipePositions);
+//                    if (swipeRight)
+//                        mCallback.onSwipeRight(mListView, swipePositions);
+//                    else
+//                        mCallback.onSwipeLeft(mListView, swipePositions);
 
                     ViewGroup.LayoutParams lp;
                     for (PendingSwipeData pendingDismiss : mPendingSwipes) {