/**
* 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 android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
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.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.ThemeService;
/**
* Exposes Astrid's built in filters to the {@link FilterListFragment}
*
* @author Tim Su <tim@todoroo.com>
*
*/
public final class CustomFilterExposer extends BroadcastReceiver implements AstridFilterExposer {
private static final String TOKEN_FILTER_ID = "id"; //$NON-NLS-1$
private static final String TOKEN_FILTER_NAME = "name"; //$NON-NLS-1$
@Autowired TagDataService tagDataService;
@Autowired GtasksPreferenceService gtasksPreferenceService;
@Override
public void onReceive(Context context, Intent intent) {
FilterListItem[] list = prepareFilters(context);
// transmit filter list
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
private FilterListItem[] prepareFilters(Context context) {
DependencyInjectionService.getInstance().inject(this);
Resources r = context.getResources();
Filter[] savedFilters = buildSavedFilters(context, r);
return savedFilters;
}
private Filter[] buildSavedFilters(Context context, Resources r) {
int themeFlags = ThemeService.getFilterThemeFlags();
boolean useCustomFilters = Preferences.getBoolean(R.string.p_use_filters, true);
StoreObjectDao dao = PluginServices.getStoreObjectDao();
TodorooCursor<StoreObject> cursor = null;
if (useCustomFilters)
cursor = dao.query(Query.select(StoreObject.PROPERTIES).where(
StoreObject.TYPE.eq(SavedFilter.TYPE)).orderBy(Order.asc(SavedFilter.NAME)));
try {
ArrayList<Filter> list = new ArrayList<Filter>();
// stock filters
if (Preferences.getBoolean(R.string.p_show_recently_modified_filter, true)) {
Filter recent = new Filter(r.getString(R.string.BFE_Recent),
r.getString(R.string.BFE_Recent),
new QueryTemplate().where(
TaskCriteria.ownedByMe()).orderBy(
Order.desc(Task.MODIFICATION_DATE)).limit(15),
null);
recent.listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_pencil, themeFlags))).getBitmap();
list.add(recent);
}
if (Preferences.getBoolean(R.string.p_show_ive_assigned_filter, true))
list.add(getAssignedByMeFilter(r));
if (useCustomFilters && cursor != null) {
StoreObject savedFilter = new StoreObject();
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
savedFilter.readFromCursor(cursor);
Filter f = SavedFilter.load(savedFilter);
Intent deleteIntent = new Intent(context, DeleteActivity.class);
deleteIntent.putExtra(TOKEN_FILTER_ID, savedFilter.getId());
deleteIntent.putExtra(TOKEN_FILTER_NAME, f.title);
f.contextMenuLabels = new String[] { context.getString(R.string.BFE_Saved_delete) };
f.contextMenuIntents = new Intent[] { deleteIntent };
f.listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_sliders, themeFlags))).getBitmap();
list.add(f);
}
}
return list.toArray(new Filter[list.size()]);
} finally {
if (cursor != null)
cursor.close();
}
}
public static Filter getAssignedByMeFilter(Resources r) {
int themeFlags = ThemeService.getFilterThemeFlags();
Filter f = new Filter(r.getString(R.string.BFE_Assigned),
r.getString(R.string.BFE_Assigned),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
Criterion.or(Task.CREATOR_ID.eq(0), Task.CREATOR_ID.eq(ActFmPreferenceService.userId())),
Task.USER_ID.neq(0))),
null);
f.listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_assigned, themeFlags))).getBitmap();
return f;
}
/**
* Simple activity for deleting stuff
*
* @author Tim Su <tim@todoroo.com>
*
*/
public static class DeleteActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(android.R.style.Theme_Dialog);
final long id = getIntent().getLongExtra(TOKEN_FILTER_ID, -1);
if(id == -1) {
finish();
return;
}
final String name = getIntent().getStringExtra(TOKEN_FILTER_NAME);
DependencyInjectionService.getInstance().inject(this);
DialogUtilities.okCancelDialog(this,
getString(R.string.DLG_delete_this_item_question, name),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PluginServices.getStoreObjectDao().delete(id);
setResult(RESULT_OK);
finish();
}
},
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setResult(RESULT_CANCELED);
finish();
}
});
}
}
@Override
public FilterListItem[] getFilters() {
if (ContextManager.getContext() == null)
return null;
return prepareFilters(ContextManager.getContext());
}
}