You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/astrid/src/main/java/com/todoroo/astrid/core/CoreFilterExposer.java

132 lines
5.0 KiB
Java

/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.core;
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;
import android.content.res.Resources;
import android.graphics.drawable.BitmapDrawable;
import org.tasks.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.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;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.tags.TaskToTagMetadata;
/**
* Exposes Astrid's built in filters to the {@link FilterListFragment}
*
* @author Tim Su <tim@todoroo.com>
*
*/
public final class CoreFilterExposer extends BroadcastReceiver implements AstridFilterExposer {
@Override
public void onReceive(Context context, Intent intent) {
Resources r = context.getResources();
ContextManager.setContext(context);
FilterListItem[] list = prepareFilters(r);
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
private FilterListItem[] prepareFilters(Resources r) {
// core filters
List<FilterListItem> filters = new ArrayList<FilterListItem>(3);
filters.add(buildInboxFilter(r));
if (Preferences.getBoolean(R.string.p_show_today_filter, true)) {
filters.add(getTodayFilter(r));
}
// transmit filter list
return filters.toArray(new FilterListItem[filters.size()]);
}
/**
* Build inbox filter
* @return
*/
public static Filter buildInboxFilter(Resources r) {
Filter inbox = new Filter(r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active),
new QueryTemplate().where(
Criterion.and(TaskCriteria.activeVisibleMine(),
Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).where(
Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY),
TaskToTagMetadata.TAG_NAME.like("x_%", "x"))))))), //$NON-NLS-1$ //$NON-NLS-2$
null);
int themeFlags = ThemeService.getFilterThemeFlags();
inbox.listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_inbox, themeFlags))).getBitmap();
return inbox;
}
public static Filter getTodayFilter(Resources r) {
int themeFlags = ThemeService.getFilterThemeFlags();
String todayTitle = AndroidUtilities.capitalize(r.getString(R.string.today));
ContentValues todayValues = new ContentValues();
todayValues.put(Task.DUE_DATE.name, PermaSql.VALUE_NOON);
Filter todayFilter = new Filter(todayTitle,
todayTitle,
new QueryTemplate().where(
Criterion.and(TaskCriteria.activeVisibleMine(),
Task.DUE_DATE.gt(0),
Task.DUE_DATE.lte(PermaSql.VALUE_EOD))),
todayValues);
todayFilter.listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_calendar, themeFlags))).getBitmap();
return todayFilter;
}
/**
* Is this the inbox?
* @param filter
* @return
*/
public static boolean isInbox(Filter filter) {
return (filter != null && filter.equals(buildInboxFilter(ContextManager.getContext().getResources())));
}
public static boolean isTodayFilter(Filter filter) {
return (filter != null && filter.equals(getTodayFilter(ContextManager.getContext().getResources())));
}
@Override
public FilterListItem[] getFilters() {
if (ContextManager.getContext() == null || ContextManager.getContext().getResources() == null) {
return null;
}
Resources r = ContextManager.getContext().getResources();
return prepareFilters(r);
}
}