Show recently completed tasks on widget

pull/46/merge
Alex Baker 12 years ago
parent 7e62156bf0
commit 938121f75e

@ -12,6 +12,8 @@ import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
import java.util.concurrent.TimeUnit;
/**
* Helpers for sorting a list of tasks
*
@ -25,12 +27,14 @@ public class SortHelper {
public static final int FLAG_SHOW_HIDDEN = 1 << 2;
public static final int FLAG_SHOW_DELETED = 1 << 3;
public static final int FLAG_DRAG_DROP = 1 << 4;
public static final int FLAG_SHOW_RECENTLY_COMPLETED = 1 << 5;
public static final int SORT_AUTO = 0;
public static final int SORT_ALPHA = 1;
public static final int SORT_DUE = 2;
public static final int SORT_IMPORTANCE = 3;
public static final int SORT_MODIFIED = 4;
public static final int SORT_WIDGET = 5;
/** preference key for sort flags. stored in public prefs */
public static final String PREF_SORT_FLAGS = "sort_flags"; //$NON-NLS-1$
@ -60,6 +64,10 @@ public class SortHelper {
originalSql = originalSql.replace(Task.COMPLETION_DATE.eq(0).toString(),
Criterion.all.toString());
}
if ((flags & FLAG_SHOW_RECENTLY_COMPLETED) > 0) {
originalSql = originalSql.replace(Task.COMPLETION_DATE.eq(0).toString(),
Criterion.or(Task.COMPLETION_DATE.eq(0), Task.COMPLETION_DATE.gt(DateUtilities.now() - TimeUnit.MINUTES.toMillis(1))).toString());
}
if((flags & FLAG_SHOW_HIDDEN) > 0) {
originalSql = originalSql.replace(TaskCriteria.isVisible().toString(),
Criterion.all.toString());
@ -104,6 +112,9 @@ public class SortHelper {
case SORT_MODIFIED:
order = Order.desc(Task.MODIFICATION_DATE);
break;
case SORT_WIDGET:
order = defaultWidgetTaskOrder();
break;
default:
order = defaultTaskOrder();
}
@ -124,6 +135,13 @@ public class SortHelper {
Task.IMPORTANCE + " + 2*" + Task.COMPLETION_DATE);
}
public static Order defaultWidgetTaskOrder() {
return Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0),
Functions.now() + "*2",
adjustedDueDateFunction()) + " + " + (2 * DateUtilities.ONE_DAY) + " * " +
Task.IMPORTANCE);
}
private static String adjustedDueDateFunction() {
return "(CASE WHEN (" + Task.DUE_DATE.name + " / 1000) % 60 > 0" + " THEN " + Task.DUE_DATE.name + " ELSE " + "(" + Task.DUE_DATE.name + " + " + (DateUtilities.ONE_HOUR * 11 + DateUtilities.ONE_MINUTE * 59) + ") END)";
}

@ -1,9 +1,12 @@
package org.tasks.widget;
import android.annotation.TargetApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Paint;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
@ -13,13 +16,21 @@ import android.widget.RemoteViewsService;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.subtasks.SubtasksHelper;
import com.todoroo.astrid.utility.AstridPreferences;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.widget.TasksWidget;
import com.todoroo.astrid.widget.WidgetConfigActivity;
import org.tasks.R;
@ -33,14 +44,16 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
TaskService taskService;
private final Context context;
private String query;
private final Filter filter;
private final int widgetId;
private boolean dark;
private TodorooCursor<Task> cursor;
public ScrollableViewsFactory(Context context, String query, boolean dark) {
public ScrollableViewsFactory(Context context, Filter filter, int widgetId, boolean dark) {
this.context = context;
this.query = query;
this.filter = filter;
this.widgetId = widgetId;
this.dark = dark;
}
@ -118,14 +131,18 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
textContent = task.getValue(Task.TITLE);
RemoteViews row = new RemoteViews(Constants.PACKAGE, R.layout.widget_row);
if (task.isCompleted()) {
textColor = r.getColor(R.color.task_list_done);
} else if (task.hasDueDate() && task.isOverdue()) {
textColor = r.getColor(R.color.task_list_overdue);
row.setInt(R.id.text, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
} else {
row.setInt(R.id.text, "setPaintFlags", Paint.ANTI_ALIAS_FLAG);
if (task.hasDueDate() && task.isOverdue()) {
textColor = r.getColor(R.color.task_list_overdue);
}
}
RemoteViews row = new RemoteViews(Constants.PACKAGE, R.layout.widget_row);
row.setTextViewText(R.id.text, textContent);
row.setTextColor(R.id.text, textColor);
row.setImageViewResource(R.id.completeBox, getCheckbox(task));
@ -150,6 +167,7 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
}
private TodorooCursor<Task> getCursor() {
String query = getQuery(context);
return taskService.fetchFiltered(query, null, Task.ID, Task.TITLE, Task.DUE_DATE, Task.COMPLETION_DATE, Task.IMPORTANCE, Task.RECURRENCE);
}
@ -157,4 +175,25 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
cursor.moveToPosition(position);
return new Task(cursor);
}
private String getQuery(Context context) {
if (SubtasksHelper.isTagFilter(filter)) {
((FilterWithCustomIntent) filter).customTaskList = new ComponentName(context, TagViewFragment.class); // In case legacy widget was created with subtasks fragment
}
SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(context);
int flags = publicPrefs.getInt(SortHelper.PREF_SORT_FLAGS, 0);
flags |= SortHelper.FLAG_SHOW_RECENTLY_COMPLETED;
int sort = publicPrefs.getInt(SortHelper.PREF_SORT_SORT, 0);
if(sort == 0) {
sort = SortHelper.SORT_WIDGET;
}
String query = SortHelper.adjustQueryForFlagsAndSort(
filter.getSqlQuery(), flags, sort).replaceAll("LIMIT \\d+", "");
String tagName = Preferences.getStringValue(WidgetConfigActivity.PREF_TITLE + widgetId);
return SubtasksHelper.applySubtasksToWidgetFilter(filter, query, tagName, 0);
}
}

@ -1,16 +1,19 @@
package org.tasks.widget;
import android.annotation.TargetApi;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.widget.RemoteViewsService;
import com.todoroo.astrid.api.Filter;
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class ScrollableWidgetUpdateService extends RemoteViewsService {
public static final String QUERY_ID = "org.tasks.widget.query_id";
public static final String IS_DARK_THEME = "org.tasks.widget.is_dark_theme";
public static final String IS_DARK_THEME = "org.tasks.widget.IS_DARK_THEME";
public static final String FILTER = "org.tasks.widget.FILTER";
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
@ -23,8 +26,10 @@ public class ScrollableWidgetUpdateService extends RemoteViewsService {
return null;
}
String queryId = extras.getString(QUERY_ID);
Bundle bundle = extras.getBundle(FILTER);
Filter filter = (Filter) bundle.get(FILTER);
int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
boolean isDarkTheme = extras.getBoolean(IS_DARK_THEME);
return new ScrollableViewsFactory(this, queryId, isDarkTheme);
return new ScrollableViewsFactory(this, filter, widgetId, isDarkTheme);
}
}

@ -8,7 +8,6 @@ import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@ -18,7 +17,6 @@ import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListActivity;
@ -27,12 +25,10 @@ import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.subtasks.SubtasksHelper;
import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.utility.AstridPreferences;
import com.todoroo.astrid.utility.Constants;
@ -42,7 +38,11 @@ import com.todoroo.astrid.widget.WidgetUpdateService;
import org.tasks.R;
import static android.content.Intent.*;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.Intent.FLAG_ACTIVITY_NO_HISTORY;
import static android.content.Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP;
public class WidgetHelper {
@ -91,7 +91,9 @@ public class WidgetHelper {
public RemoteViews createScrollableWidget(Context context, int id) {
Filter filter = getFilter(context, id);
Intent rvIntent = new Intent(context, ScrollableWidgetUpdateService.class);
rvIntent.putExtra(ScrollableWidgetUpdateService.QUERY_ID, getQuery(context, filter, id));
Bundle filterBundle = new Bundle(com.todoroo.astrid.api.Filter.class.getClassLoader());
filterBundle.putParcelable(ScrollableWidgetUpdateService.FILTER, filter);
rvIntent.putExtra(ScrollableWidgetUpdateService.FILTER, filterBundle);
rvIntent.putExtra(ScrollableWidgetUpdateService.IS_DARK_THEME, ThemeService.isDarkWidgetTheme());
rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
rvIntent.setData(Uri.parse(rvIntent.toUri(Intent.URI_INTENT_SCHEME)));
@ -244,21 +246,4 @@ public class WidgetHelper {
return filter;
}
private String getQuery(Context context, Filter filter, int widgetId) {
if (SubtasksHelper.isTagFilter(filter)) {
((FilterWithCustomIntent) filter).customTaskList = new ComponentName(context, TagViewFragment.class); // In case legacy widget was created with subtasks fragment
}
SharedPreferences publicPrefs = AstridPreferences.getPublicPrefs(context);
int flags = publicPrefs.getInt(SortHelper.PREF_SORT_FLAGS, 0);
int sort = publicPrefs.getInt(SortHelper.PREF_SORT_SORT, 0);
String query = SortHelper.adjustQueryForFlagsAndSort(
filter.getSqlQuery(), flags, sort).replaceAll("LIMIT \\d+", "");
String tagName = Preferences.getStringValue(WidgetConfigActivity.PREF_TITLE + widgetId);
return SubtasksHelper.applySubtasksToWidgetFilter(filter, query, tagName, 0);
}
}

Loading…
Cancel
Save