Custom filter activity prototype

pull/14/head
Tim Su 14 years ago
parent 8697f99cab
commit 509c699251

@ -164,15 +164,19 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name="com.todoroo.astrid.core.CustomFilterActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<!-- alarms -->
<receiver android:name="com.todoroo.astrid.alarms.AlarmTaskRepeatListener">
<intent-filter>
<action android:name="com.todoroo.astrid.TASK_REPEATED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</receiver>
<!-- tags -->
<receiver android:name="com.todoroo.astrid.tags.TagsPlugin">

@ -3,8 +3,8 @@
*/
package com.todoroo.astrid.core;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@ -12,17 +12,12 @@ import android.graphics.drawable.BitmapDrawable;
import com.timsu.astrid.R;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.FilterListActivity;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.SearchFilter;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Metadata;
@ -44,89 +39,20 @@ public final class CoreFilterExposer extends BroadcastReceiver {
// core filters
Filter inbox = buildInboxFilter(r);
SearchFilter searchFilter = new SearchFilter(CorePlugin.IDENTIFIER,
r.getString(R.string.BFE_Search));
SearchFilter searchFilter = new SearchFilter(r.getString(R.string.BFE_Search));
searchFilter.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_search)).getBitmap();
// extended
FilterCategory extended = new FilterCategory(r.getString(R.string.BFE_Extended),
new Filter[7]);
Filter recent = new Filter(r.getString(R.string.BFE_Recent),
r.getString(R.string.BFE_Recent),
new QueryTemplate().orderBy(Order.desc(Task.MODIFICATION_DATE)).limit(15),
null);
recent.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_new)).getBitmap();
ContentValues hiddenValues = new ContentValues();
hiddenValues.put(Task.HIDE_UNTIL.name, DateUtilities.now() + DateUtilities.ONE_DAY);
Filter hidden = new Filter(r.getString(R.string.BFE_Hidden),
r.getString(R.string.BFE_Hidden),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
Criterion.not(TaskCriteria.isVisible()))).
orderBy(Order.asc(Task.HIDE_UNTIL)),
hiddenValues);
hidden.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_clouds)).getBitmap();
ContentValues completedValues = new ContentValues();
hiddenValues.put(Task.COMPLETION_DATE.name, DateUtilities.now());
Filter completed = new Filter(r.getString(R.string.BFE_Completed), r.getString(R.string.BFE_Completed),
new QueryTemplate().where(Criterion.and(TaskCriteria.completed(),
Criterion.not(TaskCriteria.isDeleted()))). orderBy(Order.desc(Task.COMPLETION_DATE)),
completedValues);
completed.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_check)).getBitmap();
Filter deleted = new Filter(r.getString(R.string.BFE_Deleted),
r.getString(R.string.BFE_Deleted),
new QueryTemplate().where(TaskCriteria.isDeleted()).
orderBy(Order.desc(Task.DELETION_DATE)),
null);
deleted.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_trash)).getBitmap();
// sorting filters
Filter alphabetical = new Filter(r.getString(R.string.BFE_Alphabetical),
r.getString(R.string.BFE_Alphabetical),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible())).
orderBy(Order.asc(Functions.upper(Task.TITLE))),
null);
alphabetical.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_alpha)).getBitmap();
Filter dueDate = new Filter(r.getString(R.string.BFE_DueDate),
r.getString(R.string.BFE_DueDate),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible())).
orderBy(Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0),
DateUtilities.now()*2, Task.DUE_DATE) + "+" + Task.IMPORTANCE)), //$NON-NLS-1$
null);
dueDate.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_calendar)).getBitmap();
Filter importance = new Filter(r.getString(R.string.BFE_Importance),
r.getString(R.string.BFE_Importance),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible())).
orderBy(Order.asc(Task.IMPORTANCE + "*" + (2*DateUtilities.now()) + //$NON-NLS-1$
"+" + Functions.caseStatement(Task.DUE_DATE.eq(0), //$NON-NLS-1$
Functions.now() + "+" + DateUtilities.ONE_WEEK, //$NON-NLS-1$
Task.DUE_DATE))),
null);
importance.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_warning)).getBitmap();
extended.children[0] = recent;
extended.children[1] = hidden;
extended.children[2] = completed;
extended.children[3] = deleted;
extended.children[4] = alphabetical;
extended.children[5] = dueDate;
extended.children[6] = importance;
PendingIntent customFilterIntent = PendingIntent.getActivity(context, 0,
new Intent(context, CustomFilterActivity.class), 0);
IntentFilter customFilter = new IntentFilter(r.getString(R.string.BFE_Custom),
customFilterIntent);
customFilter.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.gnome_filter)).getBitmap();
// transmit filter list
FilterListItem[] list = new FilterListItem[3];
list[0] = inbox;
list[1] = searchFilter;
list[2] = extended;
list[2] = customFilter;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
@ -137,7 +63,7 @@ public final class CoreFilterExposer extends BroadcastReceiver {
* @return
*/
public static Filter buildInboxFilter(Resources r) {
Filter inbox = new Filter(r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active_title),
Filter inbox = new Filter(r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active),
new QueryTemplate().where(
Criterion.and(TaskCriteria.isActive(), TaskCriteria.isVisible(),
Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).where(

@ -32,10 +32,8 @@ public class TagFilterExposer extends BroadcastReceiver {
private TagService tagService;
@SuppressWarnings("nls")
private Filter filterFromTag(Context context, Tag tag, Criterion criterion) {
String listTitle = context.getString(R.string.tag_FEx_tag_w_size).
replace("$T", tag.tag).replace("$C", Integer.toString(tag.count));
String listTitle = tag.tag;
String title = context.getString(R.string.tag_FEx_name, tag.tag);
QueryTemplate tagTemplate = tag.queryTemplate(criterion);
ContentValues contentValues = new ContentValues();
@ -61,55 +59,35 @@ public class TagFilterExposer extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
tagService = TagService.getInstance();
Tag[] tagsByAlpha = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA, TaskCriteria.notDeleted());
Tag[] tags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, TaskCriteria.notDeleted());
// If user does not have any tags, don't show this section at all
if(tagsByAlpha.length == 0)
if(tags.length == 0)
return;
Resources r = context.getResources();
Filter[] filtersByAlpha = new Filter[tagsByAlpha.length];
for(int i = 0; i < tagsByAlpha.length; i++)
filtersByAlpha[i] = filterFromTag(context, tagsByAlpha[i], TaskCriteria.notDeleted());
Tag[] tagsBySize = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, TaskCriteria.isActive());
Filter[] filtersBySize = new Filter[tagsBySize.length];
for(int i = 0; i < tagsBySize.length; i++)
filtersBySize[i] = filterFromTag(context, tagsBySize[i], TaskCriteria.isActive());
Tag[] completed = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, TaskCriteria.completed());
Filter[] filtersCompleted = new Filter[completed.length];
for(int i = 0; i < completed.length; i++)
filtersCompleted[i] = filterFromTag(context, completed[i], TaskCriteria.completed());
FilterListItem[] list = new FilterListItem[3];
FilterListHeader tagsHeader = new FilterListHeader(context.getString(R.string.tag_FEx_header));
list[0] = tagsHeader;
Filter untagged = new Filter(r.getString(R.string.tag_FEx_untagged),
r.getString(R.string.tag_FEx_untagged),
tagService.untaggedTemplate(),
null);
untagged.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_untagged)).getBitmap();
list[1] = untagged;
FilterCategory tagsCategoryBySize = new FilterCategory(context.getString(R.string.tag_FEx_by_size),
filtersBySize);
tagsCategoryBySize.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags1)).getBitmap();
FilterCategory tagsCategoryAllByAlpha = new FilterCategory(context.getString(R.string.tag_FEx_alpha),
filtersByAlpha);
tagsCategoryAllByAlpha.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags1)).getBitmap();
Filter[] filters = new Filter[tags.length];
for(int i = 0; i < tags.length; i++)
filters[i] = filterFromTag(context, tags[i], TaskCriteria.isActive());
FilterCategory tagsFilter = new FilterCategory(context.getString(R.string.tag_FEx_by_size), filters);
list[2] = tagsFilter;
FilterCategory tagsCategoryCompleted = new FilterCategory(context.getString(R.string.tag_FEx_completed),
filtersCompleted);
tagsCategoryCompleted.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags2)).getBitmap();
// transmit filter list
FilterListItem[] list = new FilterListItem[5];
list[0] = tagsHeader;
list[1] = untagged;
list[2] = tagsCategoryBySize;
list[3] = tagsCategoryCompleted;
list[4] = tagsCategoryAllByAlpha;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);

@ -4,17 +4,35 @@
<!-- Resources for built-in filter plug-in -->
<!-- ================================================= Filter Exposer == -->
<!-- Active Tasks Filter -->
<string name="BFE_Active">Active Tasks</string>
<!-- Title for Active Tasks Filter (what user sees when first opening the app) -->
<string name="BFE_Active_title">Active Tasks</string>
<!-- Search Filter -->
<string name="BFE_Search">Search</string>
<string name="BFE_Search">Search...</string>
<!-- Build Your Own Filter -->
<string name="BFE_Custom">Custom Filter...</string>
<!-- =========================================== CustomFilterActivity == -->
<!-- Build Your Own Filter Activity Title-->
<string name="CFA_title">Custom Filter</string>
<!-- Filter Name edit box hint -->
<string name="CFA_filterName_hint">Filter Name</string>
<!-- Filter Name default for new filters -->
<string name="CFA_filterName_new">New Filter</string>
<!-- Filter Name default for copied filters (%s => old filter name) -->
<string name="CFA_filterName_copy">Copy of %s</string>
<!-- Filter Starting Universe: all tasks -->
<string name="CFA_universe_all">All Tasks</string>
<!-- Extended Filters Category -->
<string name="BFE_Extended">More...</string>
<!-- =================================== old stuff, TODO translation === -->
<!-- sort recent modification filter -->
<string name="BFE_Recent">Recently Modified</string>

@ -23,20 +23,11 @@
<string name="tag_FEx_header">Tags</string>
<!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<string name="tag_FEx_by_size">Sorted By Size</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string>
<!-- $T => tag, $C => count -->
<string name="tag_FEx_tag_w_size">$T ($C)</string>
<!-- %s => tag name -->
<string name="tag_FEx_name">Tagged \'%s\'</string>

@ -42,7 +42,7 @@ import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.SearchFilter;
import com.todoroo.astrid.core.SearchFilter;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.utility.Constants;

@ -1,83 +0,0 @@
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 <tim@todoroo.com>
*
*/
public class SearchFilter extends FilterListItem {
/**
* Plug-in Identifier
*/
public final String plugin;
/**
* Constructor for creating a new SearchFilter
*
* @param plugin
* {@link Addon} 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 Addon} 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<SearchFilter> CREATOR = new Parcelable.Creator<SearchFilter>() {
/**
* {@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];
}
};
}
Loading…
Cancel
Save