From 311ea3b8b18dfa247cc9f8016e207abd2117158a Mon Sep 17 00:00:00 2001 From: Tim Su Date: Tue, 21 Feb 2012 15:09:11 -0800 Subject: [PATCH] Minor tweaks to make UI look and work better when dragging --- .../astrid/subtasks/SubtasksListFragment.java | 51 +++++++++++++--- astrid/res/layout/task_list_body_subtasks.xml | 1 + .../todoroo/astrid/ui/DraggableListView.java | 60 ++++--------------- 3 files changed, 57 insertions(+), 55 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java index 0899afd22..07cda7e5d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java @@ -1,5 +1,7 @@ package com.todoroo.astrid.subtasks; +import java.util.ArrayList; +import java.util.Arrays; import java.util.concurrent.atomic.AtomicReference; import android.database.Cursor; @@ -10,7 +12,9 @@ import android.view.ViewGroup; import com.commonsware.cwac.tlv.TouchListView.DropListener; import com.commonsware.cwac.tlv.TouchListView.GrabberClickListener; +import com.commonsware.cwac.tlv.TouchListView.SwipeListener; import com.timsu.astrid.R; +import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.adapter.TaskAdapter; @@ -43,6 +47,7 @@ public class SubtasksListFragment extends TaskListFragment { getTouchListView().setDragndropBackgroundColor(tv.data); getTouchListView().setDropListener(dropListener); getTouchListView().setClickListener(rowClickListener); + getTouchListView().setSwipeListener(swipeListener); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); } @@ -51,20 +56,29 @@ public class SubtasksListFragment extends TaskListFragment { protected void setUpTaskList() { String query = filter.sqlQuery; - query = String.format("LEFT JOIN %s ON (%s = %s AND %s = '%s') %s", - Metadata.TABLE, Task.ID, Metadata.TASK, - Metadata.KEY, SubtasksMetadata.METADATA_KEY, query); - query = query.replaceAll("ORDER BY .*", ""); - query = query + String.format(" ORDER BY CAST(%s AS LONG) ASC, %s ASC", - SubtasksMetadata.ORDER, Task.ID); + String subtaskJoin = String.format("LEFT JOIN %s ON (%s = %s AND %s = '%s') ", + Metadata.TABLE, Task.ID, Metadata.TASK, + Metadata.KEY, SubtasksMetadata.METADATA_KEY); + if(!query.contains(subtaskJoin)) { + query = subtaskJoin + query; + query = query.replaceAll("ORDER BY .*", ""); + query = query + String.format(" ORDER BY CAST(%s AS LONG) ASC, %s ASC", + SubtasksMetadata.ORDER, Task.ID); - filter.sqlQuery = query; + filter.sqlQuery = query; + } super.setUpTaskList(); unregisterForContextMenu(getListView()); } + public Property[] getProperties() { + ArrayList> properties = new ArrayList>(Arrays.asList(TaskAdapter.PROPERTIES)); + properties.add(SubtasksMetadata.INDENT); + return properties.toArray(new Property[properties.size()]); + } + private final DropListener dropListener = new DropListener() { @Override public void drop(int from, int to) { @@ -88,6 +102,26 @@ public class SubtasksListFragment extends TaskListFragment { } }; + private final SwipeListener swipeListener = new SwipeListener() { + @Override + public void swipeRight(int which) { + long targetTaskId = taskAdapter.getItemId(which); + System.err.println("SWIPE RIGHT " + targetTaskId); + updater.indent(filter, SubtasksMetadata.LIST_ACTIVE_TASKS, targetTaskId, 1); + updater.debugPrint(filter, SubtasksMetadata.LIST_ACTIVE_TASKS); + loadTaskListContent(true); + } + + @Override + public void swipeLeft(int which) { + long targetTaskId = taskAdapter.getItemId(which); + System.err.println("SWIPE LEFT " + targetTaskId); + updater.indent(filter, SubtasksMetadata.LIST_ACTIVE_TASKS, targetTaskId, -1); + updater.debugPrint(filter, SubtasksMetadata.LIST_ACTIVE_TASKS); + loadTaskListContent(true); + } + }; + private final GrabberClickListener rowClickListener = new GrabberClickListener() { @Override public void onLongClick(final View v) { @@ -131,6 +165,9 @@ public class SubtasksListFragment extends TaskListFragment { super.setFieldContentsAndVisibility(view); view.getLayoutParams().height = Math.round(45 * metrics.density); + ViewHolder vh = (ViewHolder) view.getTag(); + int indent = vh.task.getValue(SubtasksMetadata.INDENT); + vh.rowBody.setPadding(Math.round(indent * 10 * metrics.density), 0, 0, 0); } @Override diff --git a/astrid/res/layout/task_list_body_subtasks.xml b/astrid/res/layout/task_list_body_subtasks.xml index cc0b87a2c..eace2fb8b 100644 --- a/astrid/res/layout/task_list_body_subtasks.xml +++ b/astrid/res/layout/task_list_body_subtasks.xml @@ -26,6 +26,7 @@ android:smoothScrollbar="false" tlv:normal_height="45dip" + tlv:expanded_height="90dip" /> diff --git a/astrid/src/com/todoroo/astrid/ui/DraggableListView.java b/astrid/src/com/todoroo/astrid/ui/DraggableListView.java index ebdb56f9d..6ac8cb2e4 100644 --- a/astrid/src/com/todoroo/astrid/ui/DraggableListView.java +++ b/astrid/src/com/todoroo/astrid/ui/DraggableListView.java @@ -63,7 +63,6 @@ public class DraggableListView extends ListView { private int mUpperBound; private int mLowerBound; private int mHeight; - private int mRemoveMode = -1; private final Rect mTempRect = new Rect(); private Bitmap mDragBitmap; private final int mTouchSlop; @@ -76,13 +75,8 @@ public class DraggableListView extends ListView { private GrabberClickListener mClickListener; private GestureDetector mGestureDetector; - public static final int FLING = 0; - public static final int SLIDE_RIGHT = 1; - public static final int SLIDE_LEFT = 2; - // --- other instance variables private int mItemHeightNormal = -1; - private int mItemHeightExpanded = -1; private Thread dragThread = null; // --- constructors @@ -102,15 +96,13 @@ public class DraggableListView extends ListView { mItemHeightNormal = a.getDimensionPixelSize( R.styleable.TouchListView_normal_height, 0); - mItemHeightExpanded = a.getDimensionPixelSize( - R.styleable.TouchListView_expanded_height, - mItemHeightNormal); dragndropBackgroundColor = a.getColor( R.styleable.TouchListView_dragndrop_background, 0x00000000); - mRemoveMode = a.getInt(R.styleable.TouchListView_remove_mode, -1); a.recycle(); } + + setSelector(null); } protected boolean isDraggableRow(@SuppressWarnings("unused") View view) { @@ -183,6 +175,7 @@ public class DraggableListView extends ListView { params.height = mItemHeightNormal; v.setLayoutParams(params); v.setVisibility(View.VISIBLE); + v.setPadding(0, 0, 0, 0); } } } @@ -210,6 +203,7 @@ public class DraggableListView extends ListView { break; } int height = mItemHeightNormal; + int marginBottom = 0; int visibility = View.VISIBLE; if (vv.equals(first)) { // processing the item that is being dragged @@ -222,7 +216,8 @@ public class DraggableListView extends ListView { } } else if (i == childnum) { if (mDragPos < getCount() - 1) { - height = mItemHeightExpanded; + marginBottom = mItemHeightNormal; + // height = mItemHeightExpanded; } } @@ -231,6 +226,7 @@ public class DraggableListView extends ListView { params.height = height; vv.setLayoutParams(params); vv.setVisibility(visibility); + vv.setPadding(0, 0, 0, marginBottom); } } // Request re-layout since we changed the items layout @@ -267,6 +263,7 @@ public class DraggableListView extends ListView { case MotionEvent.ACTION_DOWN: dragThread = new Thread(new DragRunnable(ev)); dragThread.start(); + stopDragging(); mTouchStartX = ev.getX(); mTouchStartY = ev.getY(); @@ -344,8 +341,8 @@ public class DraggableListView extends ListView { * @return true if drag was initiated */ protected boolean initiateDrag(MotionEvent ev) { - int x = (int) mTouchStartX; - int y = (int) mTouchStartY; + int x = (int) mTouchCurrentX; + int y = (int) mTouchCurrentY; int itemNum = pointToPosition(x, y); if (itemNum == AdapterView.INVALID_POSITION) @@ -356,9 +353,6 @@ public class DraggableListView extends ListView { if(!isDraggableRow(item)) return false; - stopDragging(); - - System.err.println("GOT VIEW ITEM " + itemNum + " // " + item); mDragPoint = y - item.getTop(); mCoordOffset = ((int) ev.getRawY()) - y; @@ -419,20 +413,6 @@ public class DraggableListView extends ListView { int x = (int) ev.getX(); int y = (int) ev.getY(); - float alpha = 1.0f; - int width = mDragView.getWidth(); - - if (mRemoveMode == SLIDE_RIGHT) { - if (x > width / 2) { - alpha = ((float) (width - x)) / (width / 2); - } - mWindowParams.alpha = alpha; - } else if (mRemoveMode == SLIDE_LEFT) { - if (x < width / 2) { - alpha = ((float) x) / (width / 2); - } - mWindowParams.alpha = alpha; - } mWindowParams.y = y - mDragPoint + mCoordOffset; mWindowManager.updateViewLayout(mDragView, mWindowParams); @@ -490,6 +470,8 @@ public class DraggableListView extends ListView { if(mDragging) { if (mSwipeListener != null && mDragPos == mFirstDragPos) { + System.err.format("in swipe consideration - %.2f vs %.2f\n", + mTouchCurrentX , mTouchStartX); if (mTouchCurrentX > mTouchStartX + SWIPE_THRESHOLD) mSwipeListener.swipeRight(mFirstDragPos); else if (mTouchStartX < mTouchStartX - SWIPE_THRESHOLD) @@ -539,22 +521,4 @@ public class DraggableListView extends ListView { "Headers are not supported with TouchListView"); } - @SuppressWarnings("nls") - @Override - final public void addFooterView(View v, Object data, boolean isSelectable) { - if (mRemoveMode == SLIDE_LEFT || mRemoveMode == SLIDE_RIGHT) { - throw new RuntimeException( - "Footers are not supported with TouchListView in conjunction with remove_mode"); - } - } - - @SuppressWarnings("nls") - @Override - final public void addFooterView(View v) { - if (mRemoveMode == SLIDE_LEFT || mRemoveMode == SLIDE_RIGHT) { - throw new RuntimeException( - "Footers are not supported with TouchListView in conjunction with remove_mode"); - } - } - }