Filled in draggable task list activity such that it's starting to look pretty functional now

pull/14/head
Tim Su 14 years ago
parent 1cc0b07dd2
commit b291cbe2b8

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/list_selector_background"
android:paddingTop="4dip"
android:paddingBottom="4dip"
android:paddingLeft="4dip"
android:paddingRight="4dip"
android:orientation="vertical">
<LinearLayout android:id="@+id/task_row"
android:layout_width="fill_parent"
android:layout_height="48dip"
android:layout_weight="100"
android:orientation="horizontal">
<!-- importance -->
<View android:id="@+id/importance"
android:layout_width="3dip"
android:layout_height="fill_parent"
android:layout_marginRight="5dip" />
<!-- indent -->
<View android:id="@+id/indent"
android:layout_width="0dip"
android:layout_height="fill_parent"/>
<!-- completion check-box -->
<CheckBox android:id="@+id/completeBox"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:paddingLeft="5dip"
android:button="@drawable/btn_check"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="42dip"
android:layout_weight="100"
android:gravity="center_vertical"
android:paddingLeft="5dip"
android:orientation="vertical">
<!-- task name -->
<TextView android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="3"
style="@style/TextAppearance.TAd_ItemTitle"
android:gravity="center_vertical"/>
<!-- due date -->
<TextView android:id="@+id/dueDate"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="4"
android:singleLine="true"/>
</LinearLayout>
<!-- grabber -->
<ImageView android:id="@+id/grabber"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:scaleType="center"
android:src="@drawable/grabber"/>
</LinearLayout>
<LinearLayout android:id="@+id/actions"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#4499bbcc"
android:visibility="gone"
android:paddingTop="4dip"
android:paddingLeft="4dip"
android:orientation="horizontal">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>

@ -57,13 +57,6 @@
android:visibility="gone" />
</LinearLayout>
<ImageView android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:scaleType="center"
android:src="@drawable/grabber"/>
</LinearLayout>
<TextView android:id="@+id/extendedDetails"

@ -30,8 +30,7 @@
android:drawSelectorOnTop="false"
tlv:normal_height="48dip"
tlv:grabber="@+id/icon"
tlv:remove_mode="slideRight"
tlv:grabber="@+id/grabber"
/>
</android.gesture.GestureOverlayView>

@ -1,16 +1,27 @@
package com.todoroo.astrid.activity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.commonsware.cwac.tlv.TouchListView;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
@ -27,7 +38,7 @@ public class DraggableTaskListActivity extends TaskListActivity {
// --- gtasks temp stuff
private final String listId = "17816916813445155620:0:0"; //$NON-NLS-1$
Filter filter = new Filter("Tim's Tasks", "Tim's Tasks", new QueryTemplate().join( //$NON-NLS-1$ //$NON-NLS-2$
Filter builtInFilter = new Filter("Tim's Tasks", "Tim's Tasks", new QueryTemplate().join( //$NON-NLS-1$ //$NON-NLS-2$
Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and(
MetadataCriteria.withKey("gtasks"), //$NON-NLS-1$
TaskCriteria.isVisible(),
@ -38,9 +49,22 @@ public class DraggableTaskListActivity extends TaskListActivity {
// --- end
@Override
// --- task list
public static final IntegerProperty INDENT = new IntegerProperty(Metadata.TABLE,
Metadata.VALUE4.name);
public static final IntegerProperty ORDER = new IntegerProperty(Metadata.TABLE,
Metadata.VALUE5.name);
public IntegerProperty getIndentProperty() {
return INDENT;
}
@Override
public void onCreate(Bundle icicle) {
getIntent().putExtra(TOKEN_FILTER, filter);
getIntent().putExtra(TOKEN_FILTER, builtInFilter);
super.onCreate(icicle);
TouchListView tlv = (TouchListView) getListView();
@ -53,6 +77,78 @@ public class DraggableTaskListActivity extends TaskListActivity {
return getLayoutInflater().inflate(R.layout.task_list_body_draggable, root, false);
}
// --- task adapter
/**
* Fill in the Task List with current items
* @param withCustomId force task with given custom id to be part of list
*/
@Override
protected void setUpTaskList() {
sqlQueryTemplate.set(SortSelectionActivity.adjustQueryForFlagsAndSort(filter.sqlQuery,
sortFlags, sortSort));
((TextView)findViewById(R.id.listLabel)).setText(filter.title);
// perform query
TodorooCursor<Task> currentCursor = taskService.fetchFiltered(
sqlQueryTemplate.get(), null, getProperties());
startManagingCursor(currentCursor);
// set up list adapters
taskAdapter = new DraggableTaskAdapter(this, R.layout.task_adapter_draggable_row, currentCursor, sqlQueryTemplate,
false, null);
setListAdapter(taskAdapter);
getListView().setOnScrollListener(this);
registerForContextMenu(getListView());
loadTaskListContent(false);
}
public Property<?>[] getProperties() {
ArrayList<Property<?>> properties = new ArrayList<Property<?>>(Arrays.asList(TaskAdapter.PROPERTIES));
if(getIndentProperty() != null)
properties.add(getIndentProperty());
return properties.toArray(new Property<?>[properties.size()]);
}
private final class DraggableTaskAdapter extends TaskAdapter {
private DraggableTaskAdapter(ListActivity activity, int resource,
Cursor c, AtomicReference<String> query, boolean autoRequery,
OnCompletedTaskListener onCompletedTaskListener) {
super(activity, resource, c, query, autoRequery,
onCompletedTaskListener);
}
@Override
public synchronized void setFieldContentsAndVisibility(View view) {
super.setFieldContentsAndVisibility(view);
ViewHolder viewHolder = (ViewHolder) view.getTag();
if(getIndentProperty() != null) {
int indent = viewHolder.task.getValue(getIndentProperty());
view.findViewById(R.id.indent).getLayoutParams().width = indent * 15;
}
}
@Override
protected void addListeners(final View container) {
// super.addListeners(container);
ViewHolder viewHolder = (ViewHolder)container.getTag();
viewHolder.completeBox.setOnClickListener(completeBoxListener);
// context menu listener
//container.findViewById(R.id.task_row).setOnCreateContextMenuListener(listener);
// tap listener
//container.findViewById(R.id.task_row).setOnClickListener(listener);
}
}
// --- drag and swipe handlers
private final TouchListView.DropListener onDrop = new TouchListView.DropListener() {
@Override
public void drop(int from, int to) {

@ -153,13 +153,13 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
protected DetailReceiver detailReceiver = new DetailReceiver();
protected RefreshReceiver refreshReceiver = new RefreshReceiver();
protected SyncActionReceiver syncActionReceiver = new SyncActionReceiver();
protected final AtomicReference<String> sqlQueryTemplate = new AtomicReference<String>();
protected Filter filter;
protected int sortFlags;
protected int sortSort;
private ImageButton quickAddButton;
private EditText quickAddBox;
private Filter filter;
private int sortFlags;
private int sortSort;
private final AtomicReference<String> sqlQueryTemplate = new AtomicReference<String>();
private Timer backgroundTimer;
private final LinkedHashSet<SyncAction> syncActions = new LinkedHashSet<SyncAction>();

@ -208,7 +208,8 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
view.setTag(viewHolder);
for(int i = 0; i < view.getChildCount(); i++)
view.getChildAt(i).setTag(viewHolder);
viewHolder.details.setTag(viewHolder);
if(viewHolder.details != null)
viewHolder.details.setTag(viewHolder);
// add UI component listeners
addListeners(view);
@ -328,27 +329,31 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
}
String details;
if(taskDetailLoader.containsKey(task.getId()))
details = taskDetailLoader.get(task.getId()).toString();
else
details = task.getValue(Task.DETAILS);
if(TextUtils.isEmpty(details) || DETAIL_SEPARATOR.equals(details) || task.isCompleted()) {
viewHolder.details.setVisibility(View.GONE);
} else {
viewHolder.details.setVisibility(View.VISIBLE);
if(details.startsWith(DETAIL_SEPARATOR))
details = details.substring(DETAIL_SEPARATOR.length());
viewHolder.details.setText(convertToHtml(details.trim().replace("\n", //$NON-NLS-1$
"<br>"), detailImageGetter, null)); //$NON-NLS-1$
if(viewHolder.details != null) {
if(taskDetailLoader.containsKey(task.getId()))
details = taskDetailLoader.get(task.getId()).toString();
else
details = task.getValue(Task.DETAILS);
if(TextUtils.isEmpty(details) || DETAIL_SEPARATOR.equals(details) || task.isCompleted()) {
viewHolder.details.setVisibility(View.GONE);
} else {
viewHolder.details.setVisibility(View.VISIBLE);
if(details.startsWith(DETAIL_SEPARATOR))
details = details.substring(DETAIL_SEPARATOR.length());
viewHolder.details.setText(convertToHtml(details.trim().replace("\n", //$NON-NLS-1$
"<br>"), detailImageGetter, null)); //$NON-NLS-1$
}
}
// details and decorations, expanded
decorationManager.request(viewHolder);
if(!isFling && expanded == task.getId()) {
extendedDetailManager.request(viewHolder);
if(viewHolder.extendedDetails != null)
extendedDetailManager.request(viewHolder);
taskActionManager.request(viewHolder);
} else {
viewHolder.extendedDetails.setVisibility(View.GONE);
if(viewHolder.extendedDetails != null)
viewHolder.extendedDetails.setVisibility(View.GONE);
viewHolder.actions.setVisibility(View.GONE);
}
}
@ -358,17 +363,17 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
* Set listeners for this view. This is called once per view when it is
* created.
*/
private void addListeners(final View container) {
protected void addListeners(final View container) {
ViewHolder viewHolder = (ViewHolder)container.getTag();
// check box listener
viewHolder.completeBox.setOnClickListener(completeBoxListener);
// context menu listener
//container.setOnCreateContextMenuListener(listener);
container.setOnCreateContextMenuListener(listener);
// tap listener
//container.setOnClickListener(listener);
container.setOnClickListener(listener);
}
/* ======================================================================
@ -789,7 +794,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
fontSize = Preferences.getIntegerFromString(R.string.p_fontSize, 20);
}
private final View.OnClickListener completeBoxListener = new View.OnClickListener() {
protected final View.OnClickListener completeBoxListener = new View.OnClickListener() {
public void onClick(View v) {
ViewHolder viewHolder = (ViewHolder)((View)v.getParent().getParent()).getTag();
Task task = viewHolder.task;

Loading…
Cancel
Save