diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/WaitingOnMeFragment.java b/astrid/plugin-src/com/todoroo/astrid/actfm/WaitingOnMeFragment.java new file mode 100644 index 000000000..a43fce97d --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/WaitingOnMeFragment.java @@ -0,0 +1,92 @@ +package com.todoroo.astrid.actfm; + +import java.util.concurrent.atomic.AtomicReference; + +import android.database.Cursor; +import android.graphics.Typeface; +import android.text.TextUtils; +import android.widget.TextView; + +import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Query; +import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.adapter.TaskAdapter; +import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener; +import com.todoroo.astrid.dao.TaskDao; +import com.todoroo.astrid.dao.WaitingOnMeDao; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.data.WaitingOnMe; + +public class WaitingOnMeFragment extends TaskListFragment { + + @Autowired + private WaitingOnMeDao waitingOnMeDao; + + @Autowired + private TaskDao taskDao; + + @Override + public Property[] taskProperties() { + return AndroidUtilities.addToArray(super.taskProperties(), WaitingOnMe.READ_AT, WaitingOnMe.ACKNOWLEDGED); + } + + @Override + protected TaskAdapter createTaskAdapter(TodorooCursor cursor) { + return new WaitingOnMeTaskAdapter(this, getTaskRowResource(), + cursor, sqlQueryTemplate, false, + new OnCompletedTaskListener() { + @Override + public void onCompletedTask(Task item, boolean newState) { + if (newState == true) + onTaskCompleted(item); + } + }); + } + + private static class WaitingOnMeTaskAdapter extends TaskAdapter { + + public WaitingOnMeTaskAdapter(TaskListFragment fragment, int resource, + Cursor c, AtomicReference query, boolean autoRequery, + OnCompletedTaskListener onCompletedTaskListener) { + super(fragment, resource, c, query, autoRequery, onCompletedTaskListener); + } + + @Override + protected void setTaskAppearance(ViewHolder viewHolder, Task task) { + super.setTaskAppearance(viewHolder, task); + + TextView nameView = viewHolder.nameView; + if (task.getValue(WaitingOnMe.READ_AT) == 0 && task.getValue(WaitingOnMe.ACKNOWLEDGED) == 0) + nameView.setTypeface(null, Typeface.BOLD); + else + nameView.setTypeface(null, 0); + } + + } + + @Override + public void onTaskListItemClicked(long taskId, boolean editable) { + super.onTaskListItemClicked(taskId, editable); + String uuid = taskDao.uuidFromLocalId(taskId); + if (!TextUtils.isEmpty(uuid)) { + TodorooCursor womCursor = waitingOnMeDao.query(Query.select(WaitingOnMe.ID) + .where(Criterion.and(WaitingOnMe.TASK_UUID.eq(uuid), WaitingOnMe.READ_AT.eq(0)))); + try { + if (womCursor.getCount() > 0) { + womCursor.moveToFirst(); + WaitingOnMe wom = new WaitingOnMe(womCursor); + wom.setValue(WaitingOnMe.READ_AT, DateUtilities.now()); + waitingOnMeDao.saveExisting(wom); + } + } finally { + womCursor.close(); + } + } + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ChangesHappened.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ChangesHappened.java index cbce2a733..c6fbf7747 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ChangesHappened.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ChangesHappened.java @@ -38,6 +38,8 @@ import com.todoroo.astrid.data.TaskListMetadata; import com.todoroo.astrid.data.TaskOutstanding; import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivityOutstanding; +import com.todoroo.astrid.data.WaitingOnMe; +import com.todoroo.astrid.data.WaitingOnMeOutstanding; @SuppressWarnings("nls") public class ChangesHappened> extends ClientToServerMessage { @@ -67,6 +69,9 @@ public class ChangesHappened(id, WaitingOnMe.class, + PluginServices.getWaitingOnMeDao(), PluginServices.getWaitingOnMeOutstandingDao()); default: return null; } diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java index ff47813cf..a0f2ee9cd 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CoreFilterExposer.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.ContentValues; import android.content.Context; import android.content.Intent; @@ -18,15 +19,18 @@ import android.graphics.drawable.BitmapDrawable; import com.timsu.astrid.R; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.Preferences; +import com.todoroo.astrid.actfm.WaitingOnMeFragment; import com.todoroo.astrid.activity.FilterListFragment; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridFilterExposer; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.FilterListItem; +import com.todoroo.astrid.api.FilterWithCustomIntent; import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria; @@ -64,7 +68,7 @@ public final class CoreFilterExposer extends BroadcastReceiver implements Astrid filters.add(getTodayFilter(r)); if (Preferences.getBoolean(R.string.p_show_waiting_on_me_filter, true) && - PluginServices.getWaitingOnMeDao().count(Query.select(WaitingOnMe.ID).where(WaitingOnMe.DELETED_AT.eq(0))) > 0); + PluginServices.getWaitingOnMeDao().count(Query.select(WaitingOnMe.ID).where(WaitingOnMe.DELETED_AT.eq(0))) > 0) filters.add(getWaitingOnMeFilter(r)); // transmit filter list @@ -107,12 +111,11 @@ public final class CoreFilterExposer extends BroadcastReceiver implements Astrid } public static Filter getWaitingOnMeFilter(Resources r) { - Filter waitingOnMe = new Filter(r.getString(R.string.BFE_waiting_on_me), r.getString(R.string.BFE_waiting_on_me), - new QueryTemplate().where( + FilterWithCustomIntent waitingOnMe = new FilterWithCustomIntent(r.getString(R.string.BFE_waiting_on_me), r.getString(R.string.BFE_waiting_on_me), + new QueryTemplate().join(Join.inner(WaitingOnMe.TABLE, Task.UUID.eq(WaitingOnMe.TASK_UUID))).where( Criterion.and(TaskCriteria.activeVisibleMine(), - Task.UUID.in(Query.select(WaitingOnMe.TASK_UUID) - .from(WaitingOnMe.TABLE).where(WaitingOnMe.DELETED_AT.eq(0))))), null); - + WaitingOnMe.DELETED_AT.eq(0))), null); + waitingOnMe.customTaskList = new ComponentName(ContextManager.getContext(), WaitingOnMeFragment.class); int themeFlags = ThemeService.getFilterThemeFlags(); waitingOnMe.listingIcon = ((BitmapDrawable) r.getDrawable( ThemeService.getDrawable(R.drawable.filter_inbox, themeFlags))).getBitmap(); diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 67c1d5b5a..7dc363eb9 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -1067,7 +1067,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable { * @param name * @param progress */ - void setTaskAppearance(ViewHolder viewHolder, Task task) { + protected void setTaskAppearance(ViewHolder viewHolder, Task task) { Activity activity = fragment.getActivity(); if (activity == null) return;