Minor tweaks to make UI look and work better when dragging

pull/14/head
Tim Su 14 years ago
parent 205dd7ac78
commit 311ea3b8b1

@ -1,5 +1,7 @@
package com.todoroo.astrid.subtasks; package com.todoroo.astrid.subtasks;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import android.database.Cursor; 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.DropListener;
import com.commonsware.cwac.tlv.TouchListView.GrabberClickListener; import com.commonsware.cwac.tlv.TouchListView.GrabberClickListener;
import com.commonsware.cwac.tlv.TouchListView.SwipeListener;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter;
@ -43,6 +47,7 @@ public class SubtasksListFragment extends TaskListFragment {
getTouchListView().setDragndropBackgroundColor(tv.data); getTouchListView().setDragndropBackgroundColor(tv.data);
getTouchListView().setDropListener(dropListener); getTouchListView().setDropListener(dropListener);
getTouchListView().setClickListener(rowClickListener); getTouchListView().setClickListener(rowClickListener);
getTouchListView().setSwipeListener(swipeListener);
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
} }
@ -51,20 +56,29 @@ public class SubtasksListFragment extends TaskListFragment {
protected void setUpTaskList() { protected void setUpTaskList() {
String query = filter.sqlQuery; String query = filter.sqlQuery;
query = String.format("LEFT JOIN %s ON (%s = %s AND %s = '%s') %s", String subtaskJoin = String.format("LEFT JOIN %s ON (%s = %s AND %s = '%s') ",
Metadata.TABLE, Task.ID, Metadata.TASK, Metadata.TABLE, Task.ID, Metadata.TASK,
Metadata.KEY, SubtasksMetadata.METADATA_KEY, query); Metadata.KEY, SubtasksMetadata.METADATA_KEY);
if(!query.contains(subtaskJoin)) {
query = subtaskJoin + query;
query = query.replaceAll("ORDER BY .*", ""); query = query.replaceAll("ORDER BY .*", "");
query = query + String.format(" ORDER BY CAST(%s AS LONG) ASC, %s ASC", query = query + String.format(" ORDER BY CAST(%s AS LONG) ASC, %s ASC",
SubtasksMetadata.ORDER, Task.ID); SubtasksMetadata.ORDER, Task.ID);
filter.sqlQuery = query; filter.sqlQuery = query;
}
super.setUpTaskList(); super.setUpTaskList();
unregisterForContextMenu(getListView()); unregisterForContextMenu(getListView());
} }
public Property<?>[] getProperties() {
ArrayList<Property<?>> properties = new ArrayList<Property<?>>(Arrays.asList(TaskAdapter.PROPERTIES));
properties.add(SubtasksMetadata.INDENT);
return properties.toArray(new Property<?>[properties.size()]);
}
private final DropListener dropListener = new DropListener() { private final DropListener dropListener = new DropListener() {
@Override @Override
public void drop(int from, int to) { 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() { private final GrabberClickListener rowClickListener = new GrabberClickListener() {
@Override @Override
public void onLongClick(final View v) { public void onLongClick(final View v) {
@ -131,6 +165,9 @@ public class SubtasksListFragment extends TaskListFragment {
super.setFieldContentsAndVisibility(view); super.setFieldContentsAndVisibility(view);
view.getLayoutParams().height = Math.round(45 * metrics.density); 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 @Override

@ -26,6 +26,7 @@
android:smoothScrollbar="false" android:smoothScrollbar="false"
tlv:normal_height="45dip" tlv:normal_height="45dip"
tlv:expanded_height="90dip"
/> />
</FrameLayout> </FrameLayout>

@ -63,7 +63,6 @@ public class DraggableListView extends ListView {
private int mUpperBound; private int mUpperBound;
private int mLowerBound; private int mLowerBound;
private int mHeight; private int mHeight;
private int mRemoveMode = -1;
private final Rect mTempRect = new Rect(); private final Rect mTempRect = new Rect();
private Bitmap mDragBitmap; private Bitmap mDragBitmap;
private final int mTouchSlop; private final int mTouchSlop;
@ -76,13 +75,8 @@ public class DraggableListView extends ListView {
private GrabberClickListener mClickListener; private GrabberClickListener mClickListener;
private GestureDetector mGestureDetector; 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 // --- other instance variables
private int mItemHeightNormal = -1; private int mItemHeightNormal = -1;
private int mItemHeightExpanded = -1;
private Thread dragThread = null; private Thread dragThread = null;
// --- constructors // --- constructors
@ -102,15 +96,13 @@ public class DraggableListView extends ListView {
mItemHeightNormal = a.getDimensionPixelSize( mItemHeightNormal = a.getDimensionPixelSize(
R.styleable.TouchListView_normal_height, 0); R.styleable.TouchListView_normal_height, 0);
mItemHeightExpanded = a.getDimensionPixelSize(
R.styleable.TouchListView_expanded_height,
mItemHeightNormal);
dragndropBackgroundColor = a.getColor( dragndropBackgroundColor = a.getColor(
R.styleable.TouchListView_dragndrop_background, 0x00000000); R.styleable.TouchListView_dragndrop_background, 0x00000000);
mRemoveMode = a.getInt(R.styleable.TouchListView_remove_mode, -1);
a.recycle(); a.recycle();
} }
setSelector(null);
} }
protected boolean isDraggableRow(@SuppressWarnings("unused") View view) { protected boolean isDraggableRow(@SuppressWarnings("unused") View view) {
@ -183,6 +175,7 @@ public class DraggableListView extends ListView {
params.height = mItemHeightNormal; params.height = mItemHeightNormal;
v.setLayoutParams(params); v.setLayoutParams(params);
v.setVisibility(View.VISIBLE); v.setVisibility(View.VISIBLE);
v.setPadding(0, 0, 0, 0);
} }
} }
} }
@ -210,6 +203,7 @@ public class DraggableListView extends ListView {
break; break;
} }
int height = mItemHeightNormal; int height = mItemHeightNormal;
int marginBottom = 0;
int visibility = View.VISIBLE; int visibility = View.VISIBLE;
if (vv.equals(first)) { if (vv.equals(first)) {
// processing the item that is being dragged // processing the item that is being dragged
@ -222,7 +216,8 @@ public class DraggableListView extends ListView {
} }
} else if (i == childnum) { } else if (i == childnum) {
if (mDragPos < getCount() - 1) { if (mDragPos < getCount() - 1) {
height = mItemHeightExpanded; marginBottom = mItemHeightNormal;
// height = mItemHeightExpanded;
} }
} }
@ -231,6 +226,7 @@ public class DraggableListView extends ListView {
params.height = height; params.height = height;
vv.setLayoutParams(params); vv.setLayoutParams(params);
vv.setVisibility(visibility); vv.setVisibility(visibility);
vv.setPadding(0, 0, 0, marginBottom);
} }
} }
// Request re-layout since we changed the items layout // Request re-layout since we changed the items layout
@ -267,6 +263,7 @@ public class DraggableListView extends ListView {
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
dragThread = new Thread(new DragRunnable(ev)); dragThread = new Thread(new DragRunnable(ev));
dragThread.start(); dragThread.start();
stopDragging();
mTouchStartX = ev.getX(); mTouchStartX = ev.getX();
mTouchStartY = ev.getY(); mTouchStartY = ev.getY();
@ -344,8 +341,8 @@ public class DraggableListView extends ListView {
* @return true if drag was initiated * @return true if drag was initiated
*/ */
protected boolean initiateDrag(MotionEvent ev) { protected boolean initiateDrag(MotionEvent ev) {
int x = (int) mTouchStartX; int x = (int) mTouchCurrentX;
int y = (int) mTouchStartY; int y = (int) mTouchCurrentY;
int itemNum = pointToPosition(x, y); int itemNum = pointToPosition(x, y);
if (itemNum == AdapterView.INVALID_POSITION) if (itemNum == AdapterView.INVALID_POSITION)
@ -356,9 +353,6 @@ public class DraggableListView extends ListView {
if(!isDraggableRow(item)) if(!isDraggableRow(item))
return false; return false;
stopDragging();
System.err.println("GOT VIEW ITEM " + itemNum + " // " + item);
mDragPoint = y - item.getTop(); mDragPoint = y - item.getTop();
mCoordOffset = ((int) ev.getRawY()) - y; mCoordOffset = ((int) ev.getRawY()) - y;
@ -419,20 +413,6 @@ public class DraggableListView extends ListView {
int x = (int) ev.getX(); int x = (int) ev.getX();
int y = (int) ev.getY(); 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; mWindowParams.y = y - mDragPoint + mCoordOffset;
mWindowManager.updateViewLayout(mDragView, mWindowParams); mWindowManager.updateViewLayout(mDragView, mWindowParams);
@ -490,6 +470,8 @@ public class DraggableListView extends ListView {
if(mDragging) { if(mDragging) {
if (mSwipeListener != null && mDragPos == mFirstDragPos) { if (mSwipeListener != null && mDragPos == mFirstDragPos) {
System.err.format("in swipe consideration - %.2f vs %.2f\n",
mTouchCurrentX , mTouchStartX);
if (mTouchCurrentX > mTouchStartX + SWIPE_THRESHOLD) if (mTouchCurrentX > mTouchStartX + SWIPE_THRESHOLD)
mSwipeListener.swipeRight(mFirstDragPos); mSwipeListener.swipeRight(mFirstDragPos);
else if (mTouchStartX < mTouchStartX - SWIPE_THRESHOLD) else if (mTouchStartX < mTouchStartX - SWIPE_THRESHOLD)
@ -539,22 +521,4 @@ public class DraggableListView extends ListView {
"Headers are not supported with TouchListView"); "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");
}
}
} }

Loading…
Cancel
Save