diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml
index fda239bef..8f27e506d 100644
--- a/astrid/AndroidManifest.xml
+++ b/astrid/AndroidManifest.xml
@@ -202,7 +202,7 @@
+ android:taskAffinity="" />
diff --git a/astrid/plugin-src/com/todoroo/astrid/filters/CoreFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/filters/CoreFilterExposer.java
index 4bc368879..2b6e3e8e0 100644
--- a/astrid/plugin-src/com/todoroo/astrid/filters/CoreFilterExposer.java
+++ b/astrid/plugin-src/com/todoroo/astrid/filters/CoreFilterExposer.java
@@ -19,6 +19,7 @@ import com.todoroo.astrid.activity.FilterListActivity;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
+import com.todoroo.astrid.api.SearchFilter;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Task;
@@ -44,10 +45,15 @@ public final class CoreFilterExposer extends BroadcastReceiver {
null);
all.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_all)).getBitmap();
+ SearchFilter searchFilter = new SearchFilter(CorePlugin.IDENTIFIER,
+ "Search");
+ searchFilter.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_search)).getBitmap();
+
// transmit filter list
- FilterListItem[] list = new FilterListItem[2];
+ FilterListItem[] list = new FilterListItem[3];
list[0] = inbox;
list[1] = all;
+ list[2] = searchFilter;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ITEMS, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java b/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java
index e7b0d8de0..329e55b75 100644
--- a/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java
+++ b/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java
@@ -153,6 +153,7 @@ public class Notifications extends BroadcastReceiver {
Intent notifyIntent = new Intent(context, NotificationActivity.class);
notifyIntent.putExtra(NotificationActivity.TOKEN_ID, id);
+ notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context,
(int)id, notifyIntent, PendingIntent.FLAG_ONE_SHOT);
diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java
index 370e67436..b4d8149bd 100644
--- a/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java
+++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagService.java
@@ -2,8 +2,8 @@ package com.todoroo.astrid.tags;
import java.util.ArrayList;
-import com.todoroo.andlib.data.Property.CountProperty;
import com.todoroo.andlib.data.TodorooCursor;
+import com.todoroo.andlib.data.Property.CountProperty;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
@@ -79,7 +79,7 @@ public class TagService {
}
public QueryTemplate untaggedTemplate() {
- return new QueryTemplate().join(Join.inner(Metadata.TABLE,
+ return new QueryTemplate().join(Join.left(Metadata.TABLE,
Task.ID.eq(Metadata.TASK))).where(Criterion.and(
TaskCriteria.isActive(), MetadataCriteria.withKey(KEY),
Metadata.VALUE.isNull()));
diff --git a/astrid/res/drawable/filter_search.png b/astrid/res/drawable/filter_search.png
new file mode 100644
index 000000000..cf3d97f75
Binary files /dev/null and b/astrid/res/drawable/filter_search.png differ
diff --git a/astrid/res/layout/edit_tag_item.xml b/astrid/res/layout/tag_edit_row.xml
similarity index 100%
rename from astrid/res/layout/edit_tag_item.xml
rename to astrid/res/layout/tag_edit_row.xml
diff --git a/astrid/res/layout/task_row.xml b/astrid/res/layout/task_adapter_row.xml
similarity index 88%
rename from astrid/res/layout/task_row.xml
rename to astrid/res/layout/task_adapter_row.xml
index 80270f383..4679a0f4c 100644
--- a/astrid/res/layout/task_row.xml
+++ b/astrid/res/layout/task_adapter_row.xml
@@ -1,14 +1,14 @@
@@ -18,14 +18,13 @@
android:layout_height="fill_parent"
android:layout_weight="1"
android:paddingLeft="10px"
- android:button="@drawable/btn_check"
- android:scaleType="center"/>
+ android:button="@drawable/btn_check"/>
@@ -48,7 +47,7 @@
diff --git a/astrid/res/layout/task_list_activity.xml b/astrid/res/layout/task_list_activity.xml
index cf823f32c..d587ec717 100644
--- a/astrid/res/layout/task_list_activity.xml
+++ b/astrid/res/layout/task_list_activity.xml
@@ -51,7 +51,7 @@
@@ -70,7 +70,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:src="@drawable/btn_add"/>
+ android:src="@drawable/btn_add"
+ android:scaleType="fitCenter"/>
+ android:src="@drawable/btn_add_extended"
+ android:scaleType="fitCenter"/>
diff --git a/astrid/res/values/strings-3.0.xml b/astrid/res/values/strings-3.0.xml
index 0aa0a7cfa..3fd9ad16e 100644
--- a/astrid/res/values/strings-3.0.xml
+++ b/astrid/res/values/strings-3.0.xml
@@ -195,8 +195,8 @@ button: add task & go to the edit page.
Create Shortcut On Desktop
-
- Search...
+
+ Search Tasks...
Help
@@ -207,12 +207,12 @@ button: add task & go to the edit page.
Name of shortcut:
-
- Search For Tasks
-
Search For Tasks
+
+ Matching \'%s\'
+
Help: Filters Page
diff --git a/astrid/res/xml/filter_list_searchable.xml b/astrid/res/xml/filter_list_searchable.xml
index 154603030..e032d2713 100644
--- a/astrid/res/xml/filter_list_searchable.xml
+++ b/astrid/res/xml/filter_list_searchable.xml
@@ -1,7 +1,7 @@
diff --git a/astrid/src/com/todoroo/astrid/activity/FilterListActivity.java b/astrid/src/com/todoroo/astrid/activity/FilterListActivity.java
index 8d89d6d6e..9867efb97 100644
--- a/astrid/src/com/todoroo/astrid/activity/FilterListActivity.java
+++ b/astrid/src/com/todoroo/astrid/activity/FilterListActivity.java
@@ -13,30 +13,34 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.ContextMenu.ContextMenuInfo;
import android.widget.EditText;
import android.widget.ExpandableListView;
-import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.FrameLayout;
import android.widget.Toast;
+import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
+import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem;
+import com.todoroo.astrid.api.SearchFilter;
+import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.utility.Constants;
@@ -66,7 +70,6 @@ public class FilterListActivity extends ExpandableListActivity {
protected DialogUtilities dialogUtilities;
FilterAdapter adapter = null;
- String search = null;
FilterReceiver filterReceiver = new FilterReceiver();
/* ======================================================================
@@ -106,10 +109,14 @@ public class FilterListActivity extends ExpandableListActivity {
final String intentAction = intent.getAction();
if (Intent.ACTION_SEARCH.equals(intentAction)) {
- search = intent.getStringExtra(SearchManager.QUERY);
- dialogUtilities.okDialog(this, "TODO!", null); //$NON-NLS-1$
- } else {
- search = null;
+ String query = intent.getStringExtra(SearchManager.QUERY);
+ Filter filter = new Filter(null, null,
+ getString(R.string.FLA_search_filter, query),
+ new QueryTemplate().where(Task.TITLE.like("%" + query + "%")), //$NON-NLS-1$ //$NON-NLS-2$
+ null);
+ intent = new Intent(FilterListActivity.this, TaskListActivity.class);
+ intent.putExtra(TaskListActivity.TOKEN_FILTER, filter);
+ startActivity(intent);
}
}
@@ -226,6 +233,8 @@ public class FilterListActivity extends ExpandableListActivity {
intent.putExtra(TaskListActivity.TOKEN_FILTER, filter);
startActivity(intent);
return true;
+ } else if(item instanceof SearchFilter) {
+ onSearchRequested();
}
return false;
}
@@ -309,9 +318,9 @@ public class FilterListActivity extends ExpandableListActivity {
R.drawable.icon_blank)).getBitmap();
bitmap = bitmap.copy(bitmap.getConfig(), true);
Canvas canvas = new Canvas(bitmap);
- canvas.drawBitmap(emblem, Math.max(0, bitmap.getWidth() -
- emblem.getWidth()), Math.max(0, bitmap.getHeight() -
- emblem.getHeight()), null);
+ canvas.drawBitmap(emblem, new Rect(0, 0, emblem.getWidth(), emblem.getHeight()),
+ new Rect(bitmap.getWidth() - 32, bitmap.getHeight() - 32,
+ bitmap.getWidth(), bitmap.getHeight()), null);
Intent createShortcutIntent = new Intent();
createShortcutIntent.putExtra(
diff --git a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java
index 15356ab94..c60db33dd 100644
--- a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java
+++ b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java
@@ -1150,7 +1150,7 @@ public final class TaskEditActivity extends TabActivity {
}
LayoutInflater inflater = getLayoutInflater();
- final View tagItem = inflater.inflate(R.layout.edit_tag_item, null);
+ final View tagItem = inflater.inflate(R.layout.tag_edit_row, null);
tagsContainer.addView(tagItem);
AutoCompleteTextView textView = (AutoCompleteTextView)tagItem.
diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java
index 0c61445c7..a9e649447 100644
--- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java
+++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java
@@ -411,7 +411,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
startManagingCursor(currentCursor);
// set up list adapters
- taskAdapter = new TaskAdapter(this, R.layout.task_row,
+ taskAdapter = new TaskAdapter(this, R.layout.task_adapter_row,
currentCursor, false, null);
setListAdapter(taskAdapter);
getListView().setOnScrollListener(this);
diff --git a/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java b/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java
index 0354f8e1a..c0a4f3e69 100644
--- a/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java
+++ b/astrid/src/com/todoroo/astrid/adapter/FilterAdapter.java
@@ -9,13 +9,13 @@ import android.app.Activity;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
+import android.widget.ImageView.ScaleType;
import com.timsu.astrid.R;
import com.todoroo.astrid.api.Filter;
@@ -68,7 +68,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
FilterListItem item = (FilterListItem)getChild(groupPosition, childPosition);
- View textView = getFilterView((Filter)item, true);
+ View textView = getStandardView((Filter)item, true);
return textView;
}
@@ -107,10 +107,8 @@ public class FilterAdapter extends BaseExpandableListAdapter {
return getHeaderView((FilterListHeader)item, isChild);
else if(item instanceof FilterCategory)
return getCategoryView((FilterCategory)item, isExpanded);
- else if(item instanceof Filter)
- return getFilterView((Filter)item, isChild);
else
- throw new UnsupportedOperationException("unknown item type"); //$NON-NLS-1$
+ return getStandardView(item, isChild);
}
public View getCategoryView(FilterCategory filter, boolean isExpanded) {
@@ -125,10 +123,11 @@ public class FilterAdapter extends BaseExpandableListAdapter {
image.setImageResource(R.drawable.expander_ic_maximized);
else
image.setImageResource(R.drawable.expander_ic_minimized);
- FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
- LayoutParams.FILL_PARENT);
+ FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(
+ 32, 32);
llp.gravity = Gravity.CENTER_VERTICAL;
image.setLayoutParams(llp);
+ image.setScaleType(ScaleType.FIT_CENTER);
layout.addView(image);
TextView textView = new TextView(activity);
@@ -168,7 +167,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
return textView;
}
- public View getFilterView(Filter filter, boolean isChild) {
+ public View getStandardView(FilterListItem filter, boolean isChild) {
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, 64);
diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java
index 1665b07a5..c275b05ee 100644
--- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java
+++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java
@@ -11,11 +11,13 @@ import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Paint;
import android.view.ContextMenu;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
+import android.view.View.OnKeyListener;
import android.widget.CheckBox;
import android.widget.CursorAdapter;
import android.widget.LinearLayout;
@@ -338,10 +340,31 @@ public class TaskAdapter extends CursorAdapter {
* created.
*/
private void addListeners(final View container) {
+ // check box listener
final CheckBox completeBox = ((CheckBox)container.findViewById(R.id.completeBox));
completeBox.setOnClickListener(completeBoxListener);
+ // 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 {
diff --git a/astrid/src/com/todoroo/astrid/api/SearchFilter.java b/astrid/src/com/todoroo/astrid/api/SearchFilter.java
new file mode 100644
index 000000000..9a1958ceb
--- /dev/null
+++ b/astrid/src/com/todoroo/astrid/api/SearchFilter.java
@@ -0,0 +1,83 @@
+package com.todoroo.astrid.api;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Special filter that triggers the search functionality when accessed.
+ *
+ * @author Tim Su
+ *
+ */
+public class SearchFilter extends FilterListItem {
+
+ /**
+ * Plug-in Identifier
+ */
+ public final String plugin;
+
+ /**
+ * Constructor for creating a new SearchFilter
+ *
+ * @param plugin
+ * {@link Plugin} identifier that encompasses object
+ * @param listingTitle
+ * Title of this item as displayed on the lists page, e.g. Inbox
+ */
+ public SearchFilter(String plugin, String listingTitle) {
+ this.plugin = plugin;
+ this.listingTitle = listingTitle;
+ }
+
+ /**
+ * Constructor for creating a new SearchFilter
+ *
+ * @param plugin
+ * {@link Plugin} identifier that encompasses object
+ */
+ protected SearchFilter(String plugin) {
+ this.plugin = plugin;
+ }
+
+ // --- parcelable
+
+ /**
+ * {@inheritDoc}
+ */
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(plugin);
+ super.writeToParcel(dest, flags);
+ }
+
+ /**
+ * Parcelable creator
+ */
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+
+ /**
+ * {@inheritDoc}
+ */
+ public SearchFilter createFromParcel(Parcel source) {
+ SearchFilter item = new SearchFilter(source.readString());
+ item.readFromParcel(source);
+ return item;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SearchFilter[] newArray(int size) {
+ return new SearchFilter[size];
+ }
+
+ };
+
+}