From 329f37102074e2f3c0c7dd658c1ebce3ada1b50e Mon Sep 17 00:00:00 2001 From: Tim Su Date: Tue, 6 Jul 2010 01:51:19 -0700 Subject: [PATCH] Made searching work, fixed up goodies --- astrid/AndroidManifest.xml | 2 +- .../astrid/filters/CoreFilterExposer.java | 8 +- .../astrid/reminders/Notifications.java | 1 + .../com/todoroo/astrid/tags/TagService.java | 4 +- astrid/res/drawable/filter_search.png | Bin 0 -> 615 bytes .../{edit_tag_item.xml => tag_edit_row.xml} | 0 .../{task_row.xml => task_adapter_row.xml} | 11 ++- astrid/res/layout/task_list_activity.xml | 8 +- astrid/res/values/strings-3.0.xml | 10 +-- astrid/res/xml/filter_list_searchable.xml | 2 +- .../astrid/activity/FilterListActivity.java | 29 +++--- .../astrid/activity/TaskEditActivity.java | 2 +- .../astrid/activity/TaskListActivity.java | 2 +- .../todoroo/astrid/adapter/FilterAdapter.java | 15 ++-- .../todoroo/astrid/adapter/TaskAdapter.java | 23 +++++ .../com/todoroo/astrid/api/SearchFilter.java | 83 ++++++++++++++++++ 16 files changed, 161 insertions(+), 39 deletions(-) create mode 100644 astrid/res/drawable/filter_search.png rename astrid/res/layout/{edit_tag_item.xml => tag_edit_row.xml} (100%) rename astrid/res/layout/{task_row.xml => task_adapter_row.xml} (88%) create mode 100644 astrid/src/com/todoroo/astrid/api/SearchFilter.java 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 0000000000000000000000000000000000000000..cf3d97f75e9cde9c143980d89272fe61fc2d64ee GIT binary patch literal 615 zcmV-t0+{`YP)gNuvOO$0ks zMIj=HnnBRUR?tKXG11rxCU4&7dG4NbuvR2_mEvc)n?Cow;~Wve|KR^>9@p5l)|QB+ z$jmun3q#x>;ss-PW_mnr2MHVzLAl1RW&0?VkixF*4t!St0YVb2wnKdU(kmOHiL;aW zK8Xte%(k>MVGG$E4no6dcNnb>BhVHHGD&1pv4YZ68kE2V03t5#PCEFm7=ad$6)+3B zTCmn*?A?=u(o~ET7~-7g0)ZB=6|lumi4}B}MLgy~Ysy6)Q5%Al7|05&1z3Jpu>cF8 z3?VXs*3<}%h3`5Wld)N2zJnk%Agw<~3k)sPTLFd=F5;d8-bj-09SkQuynfflNcZLN z!^_37fdZvzrq=9~mp*($%mcDRKC&qvaaZuX+C=AT6O*~tHl>0mcP<_q>-z%$xO(@! zYluq5a8VQI$S@4?r*v;gPo!QQ%pX3A#>xx4t=w-L6COWx?aj&`f+!YePsFtj=hOQR zP3=E2j@9L7s8;T^&s?u(Hdpu?CubjMrGn{t_37>9$|AD)QE08weJlKn8|OyjL~7oP zC8mPT`jzuH*Dh^I0048RGafUIT)4H~*m8m>egI0iH=(LB%b@@O002ovPDHLkV1lw0 B3 @@ -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]; + } + + }; + +}