diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 8b9693611..99881ae55 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -192,7 +192,7 @@ - + diff --git a/astrid/astrid.launch b/astrid/astrid.launch index e11e53fbf..e1e654a56 100644 --- a/astrid/astrid.launch +++ b/astrid/astrid.launch @@ -4,7 +4,9 @@ + + diff --git a/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java index 5d7e42e0f..5a8a3ceea 100644 --- a/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/notes/NoteDetailExposer.java @@ -37,6 +37,8 @@ public class NoteDetailExposer extends BroadcastReceiver { if(staticTaskService == null) { DependencyInjectionService.getInstance().inject(this); staticTaskService = taskService; + } else { + taskService = staticTaskService; } Task task = taskService.fetchById(taskId, Task.NOTES); @@ -46,8 +48,7 @@ public class NoteDetailExposer extends BroadcastReceiver { if(notes.length() == 0) return; - TaskDetail taskDetail = new TaskDetail(NotesPlugin.IDENTIFIER, - "Notes: " + notes); + TaskDetail taskDetail = new TaskDetail(NotesPlugin.IDENTIFIER, notes); // transmit TaskDetail[] details = new TaskDetail[1]; diff --git a/astrid/res/drawable/btn_check_off.png b/astrid/res/drawable/btn_check_off.png index 56d386154..df7f9d1dd 100644 Binary files a/astrid/res/drawable/btn_check_off.png and b/astrid/res/drawable/btn_check_off.png differ diff --git a/astrid/res/drawable/btn_check_off_pressed.png b/astrid/res/drawable/btn_check_off_pressed.png index 47c1a460f..c26c98b4c 100644 Binary files a/astrid/res/drawable/btn_check_off_pressed.png and b/astrid/res/drawable/btn_check_off_pressed.png differ diff --git a/astrid/res/drawable/btn_check_on.png b/astrid/res/drawable/btn_check_on.png index fc517a108..42dbf8385 100644 Binary files a/astrid/res/drawable/btn_check_on.png and b/astrid/res/drawable/btn_check_on.png differ diff --git a/astrid/res/drawable/btn_check_on_pressed.png b/astrid/res/drawable/btn_check_on_pressed.png index ee2175d04..f673b391b 100644 Binary files a/astrid/res/drawable/btn_check_on_pressed.png and b/astrid/res/drawable/btn_check_on_pressed.png differ diff --git a/astrid/res/layout/task_adapter_row.xml b/astrid/res/layout/task_adapter_row.xml index 71ddee4a7..d22544fad 100644 --- a/astrid/res/layout/task_adapter_row.xml +++ b/astrid/res/layout/task_adapter_row.xml @@ -3,31 +3,28 @@ diff --git a/astrid/res/layout/task_list_activity.xml b/astrid/res/layout/task_list_activity.xml index 77190497c..9218958bf 100644 --- a/astrid/res/layout/task_list_activity.xml +++ b/astrid/res/layout/task_list_activity.xml @@ -70,6 +70,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" + android:visibility="gone" android:src="@drawable/tango_add" android:scaleType="fitCenter"/> diff --git a/astrid/res/values/strings-3.0.xml b/astrid/res/values/strings-3.0.xml index 3fd9ad16e..6c5839756 100644 --- a/astrid/res/values/strings-3.0.xml +++ b/astrid/res/values/strings-3.0.xml @@ -146,6 +146,9 @@ Search Within This Filter + + Custom + Add to this list... diff --git a/astrid/res/values/strings-reminders.xml b/astrid/res/values/strings-reminders.xml index 29d7b5302..fba6b5678 100644 --- a/astrid/res/values/strings-reminders.xml +++ b/astrid/res/values/strings-reminders.xml @@ -10,13 +10,13 @@ Remind me... - when it\'s time to start the task + ... when it\'s time to start the task - when task is overdue + ... when task is overdue - randomly every + ... randomly once Ring/Vibrate Type: @@ -29,12 +29,12 @@ - hour - day - week - two weeks - month - two months + an hour + a day + a week + in two weeks + a month + in two months diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index fb887c391..b31ac1769 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -18,20 +18,25 @@ import android.database.Cursor; import android.os.Bundle; import android.os.Parcelable; import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.View.OnClickListener; import android.view.Window; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View.OnClickListener; +import android.view.View.OnKeyListener; +import android.view.inputmethod.EditorInfo; import android.widget.AbsListView; -import android.widget.AbsListView.OnScrollListener; -import android.widget.AdapterView.AdapterContextMenuInfo; +import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; +import android.widget.AbsListView.OnScrollListener; +import android.widget.AdapterView.AdapterContextMenuInfo; +import android.widget.TextView.OnEditorActionListener; import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; @@ -52,6 +57,7 @@ import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.TaskDetail; import com.todoroo.astrid.dao.Database; +import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.filters.CoreFilterExposer; import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Task; @@ -126,6 +132,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { protected TaskAdapter taskAdapter = null; protected DetailReceiver detailReceiver = new DetailReceiver(); + EditText quickAddBox; Filter filter; /* ====================================================================== @@ -232,20 +239,61 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { ((TextView)findViewById(R.id.listLabel)).setText(filter.title); - ((ImageButton)findViewById(R.id.quickAddButton)).setOnClickListener(new OnClickListener() { + getListView().setOnKeyListener(new OnKeyListener() { + @Override + public boolean onKey(View view, int keyCode, KeyEvent event) { + if(event.getAction() != KeyEvent.ACTION_UP) + return false; + + // hot-key to set task priority - 1-4 or ALT + Q-R + if(event.getNumber() >= '1' && event.getNumber() <= '4') { + view = getListView().getSelectedView(); + int importance = event.getNumber() - '1'; + Task task = ((ViewHolder)view.getTag()).task; + task.setValue(Task.IMPORTANCE, importance); + taskService.save(task, false); + taskAdapter.setFieldContentsAndVisibility(view, task); + } + + return false; + } + }); + + quickAddBox = (EditText) findViewById(R.id.quickAddText); + quickAddBox.setOnEditorActionListener(new OnEditorActionListener() { + /** + * When user presses enter, quick-add the task + */ + @Override + public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { + if(actionId == EditorInfo.IME_NULL && quickAddBox.getText().length() > 0) { + quickAddTask(quickAddBox.getText().toString(), true); + return true; + } + return false; + } + }); + + final ImageButton quickAddButton = ((ImageButton)findViewById(R.id.quickAddButton)); + quickAddBox.setOnKeyListener(new OnKeyListener() { + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + quickAddButton.setVisibility(View.VISIBLE); + return false; + } + }); + + quickAddButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { - TextView quickAdd = (TextView)findViewById(R.id.quickAddText); - if(quickAdd.getText().length() > 0) { - quickAddTask(quickAdd.getText().toString()); - loadTaskListContent(true); + if(quickAddBox.getText().length() > 0) { + quickAddTask(quickAddBox.getText().toString(), true); } } }); ((ImageButton)findViewById(R.id.extendedAddButton)).setOnClickListener(new OnClickListener() { public void onClick(View v) { - TextView quickAdd = (TextView)findViewById(R.id.quickAddText); - Task task = quickAddTask(quickAdd.getText().toString()); + Task task = quickAddTask(quickAddBox.getText().toString(), false); Intent intent = new Intent(TaskListActivity.this, TaskEditActivity.class); intent.putExtra(TaskEditActivity.ID_TOKEN, task.getId()); startActivityForResult(intent, ACTIVITY_EDIT_TASK); @@ -259,7 +307,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { * @return */ @SuppressWarnings("nls") - protected Task quickAddTask(String title) { + protected Task quickAddTask(String title, boolean selectNewTask) { try { Task task = new Task(); task.setValue(Task.TITLE, title); @@ -289,6 +337,12 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { TextView quickAdd = (TextView)findViewById(R.id.quickAddText); quickAdd.setText(""); //$NON-NLS-1$ + + if(selectNewTask) { + loadTaskListContent(true); + selectCustomId(task.getId()); + } + return task; } catch (Exception e) { exceptionService.displayAndReportError(this, "quick-add-task", e); @@ -408,10 +462,14 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { getListView().setSelection(oldListItemSelected); } - /** Fill in the Action Item List with current items */ + /** + * Fill in the Task List with current items + * @param withCustomId force task with given custom id to be part of list + */ + @SuppressWarnings("nls") protected void setUpTaskList() { + // use default ordering if none specified if(!filter.sqlQuery.toUpperCase().contains("ORDER BY")) { - // use default ordering if none specified filter.sqlQuery += " ORDER BY " + Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0), DateUtilities.now() + DateUtilities.ONE_WEEK, Task.DUE_DATE) + " + 200000000 * " + @@ -433,6 +491,49 @@ public class TaskListActivity extends ListActivity implements OnScrollListener { loadTaskListContent(false); } + /** + * Select a custom task id in the list. If it doesn't exist, create + * a new custom filter + * @param withCustomId + */ + @SuppressWarnings("nls") + private void selectCustomId(long withCustomId) { + // if already in the list, select it + TodorooCursor currentCursor = (TodorooCursor)taskAdapter.getCursor(); + for(int i = 0; i < currentCursor.getCount(); i++) { + currentCursor.moveToPosition(i); + if(currentCursor.get(Task.ID) == withCustomId) { + getListView().setSelection(i); + return; + } + } + + // create a custom cursor + if(!filter.sqlQuery.contains("WHERE")) + filter.sqlQuery += " WHERE " + TaskCriteria.byId(withCustomId); + else + filter.sqlQuery = filter.sqlQuery.replace("WHERE ", "WHERE " + + TaskCriteria.byId(withCustomId) + " OR "); + currentCursor = taskService.fetchFiltered( + TaskAdapter.PROPERTIES, filter); + startManagingCursor(currentCursor); + + taskAdapter.changeCursor(currentCursor); + + // update title + filter.title = getString(R.string.TLA_custom); + ((TextView)findViewById(R.id.listLabel)).setText(filter.title); + + // try selecting again + for(int i = 0; i < currentCursor.getCount(); i++) { + currentCursor.moveToPosition(i); + if(currentCursor.get(Task.ID) == withCustomId) { + getListView().setSelection(i); + break; + } + } + } + /* ====================================================================== * ============================================================== actions * ====================================================================== */ diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 33ea1191f..bdce7fa4f 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -11,13 +11,11 @@ import android.content.res.Resources; import android.database.Cursor; import android.graphics.Paint; import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnCreateContextMenuListener; -import android.view.View.OnKeyListener; import android.view.ViewGroup; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View.OnCreateContextMenuListener; import android.widget.CheckBox; import android.widget.CursorAdapter; import android.widget.LinearLayout; @@ -185,7 +183,7 @@ public class TaskAdapter extends CursorAdapter { } /** Helper method to set the contents and visibility of each field */ - private void setFieldContentsAndVisibility(View view, Task task) { + public void setFieldContentsAndVisibility(View view, Task task) { Resources r = activity.getResources(); ViewHolder viewHolder = (ViewHolder)view.getTag(); @@ -338,25 +336,6 @@ public class TaskAdapter extends CursorAdapter { // context menu listener container.setOnCreateContextMenuListener(listener); - - // key press listener - container.setOnKeyListener(new OnKeyListener() { - public boolean onKey(View v, int keyCode, KeyEvent event) { - if(event.getAction() != KeyEvent.ACTION_UP) - return false; - - // hot-key to set task priority - 1-4 or ALT + Q-R - if(event.getNumber() >= '1' && event.getNumber() <= '4') { - int importance = event.getNumber() - '1'; - Task task = ((ViewHolder)container.getTag()).task; - task.setValue(Task.IMPORTANCE, importance); - taskService.save(task, false); - setFieldContentsAndVisibility(container, task); - } - - return false; - } - }); } class ContextMenuListener implements OnCreateContextMenuListener {