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.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria; import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
import java.util.concurrent.TimeUnit;
/** /**
* Helpers for sorting a list of tasks * 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_HIDDEN = 1 << 2;
public static final int FLAG_SHOW_DELETED = 1 << 3; public static final int FLAG_SHOW_DELETED = 1 << 3;
public static final int FLAG_DRAG_DROP = 1 << 4; 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_AUTO = 0;
public static final int SORT_ALPHA = 1; public static final int SORT_ALPHA = 1;
public static final int SORT_DUE = 2; public static final int SORT_DUE = 2;
public static final int SORT_IMPORTANCE = 3; public static final int SORT_IMPORTANCE = 3;
public static final int SORT_MODIFIED = 4; public static final int SORT_MODIFIED = 4;
public static final int SORT_WIDGET = 5;
/** preference key for sort flags. stored in public prefs */ /** preference key for sort flags. stored in public prefs */
public static final String PREF_SORT_FLAGS = "sort_flags"; //$NON-NLS-1$ 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(), originalSql = originalSql.replace(Task.COMPLETION_DATE.eq(0).toString(),
Criterion.all.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) { if((flags & FLAG_SHOW_HIDDEN) > 0) {
originalSql = originalSql.replace(TaskCriteria.isVisible().toString(), originalSql = originalSql.replace(TaskCriteria.isVisible().toString(),
Criterion.all.toString()); Criterion.all.toString());
@ -104,6 +112,9 @@ public class SortHelper {
case SORT_MODIFIED: case SORT_MODIFIED:
order = Order.desc(Task.MODIFICATION_DATE); order = Order.desc(Task.MODIFICATION_DATE);
break; break;
case SORT_WIDGET:
order = defaultWidgetTaskOrder();
break;
default: default:
order = defaultTaskOrder(); order = defaultTaskOrder();
} }
@ -124,6 +135,13 @@ public class SortHelper {
Task.IMPORTANCE + " + 2*" + Task.COMPLETION_DATE); 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() { 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)"; 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; package org.tasks.widget;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Paint;
import android.os.Build; import android.os.Build;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
@ -13,13 +16,21 @@ import android.widget.RemoteViewsService;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService; 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.activity.TaskEditFragment;
import com.todoroo.astrid.adapter.TaskAdapter; 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.dao.Database;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.TaskService; 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.utility.Constants;
import com.todoroo.astrid.widget.TasksWidget; import com.todoroo.astrid.widget.TasksWidget;
import com.todoroo.astrid.widget.WidgetConfigActivity;
import org.tasks.R; import org.tasks.R;
@ -33,14 +44,16 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
TaskService taskService; TaskService taskService;
private final Context context; private final Context context;
private String query; private final Filter filter;
private final int widgetId;
private boolean dark; private boolean dark;
private TodorooCursor<Task> cursor; 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.context = context;
this.query = query; this.filter = filter;
this.widgetId = widgetId;
this.dark = dark; this.dark = dark;
} }
@ -118,14 +131,18 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
textContent = task.getValue(Task.TITLE); textContent = task.getValue(Task.TITLE);
RemoteViews row = new RemoteViews(Constants.PACKAGE, R.layout.widget_row);
if (task.isCompleted()) { if (task.isCompleted()) {
textColor = r.getColor(R.color.task_list_done); textColor = r.getColor(R.color.task_list_done);
} else if (task.hasDueDate() && task.isOverdue()) { row.setInt(R.id.text, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
textColor = r.getColor(R.color.task_list_overdue); } 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.setTextViewText(R.id.text, textContent);
row.setTextColor(R.id.text, textColor); row.setTextColor(R.id.text, textColor);
row.setImageViewResource(R.id.completeBox, getCheckbox(task)); row.setImageViewResource(R.id.completeBox, getCheckbox(task));
@ -150,6 +167,7 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
} }
private TodorooCursor<Task> getCursor() { 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); 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); cursor.moveToPosition(position);
return new Task(cursor); 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; package org.tasks.widget;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.appwidget.AppWidgetManager;
import android.content.Intent; import android.content.Intent;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.widget.RemoteViewsService; import android.widget.RemoteViewsService;
import com.todoroo.astrid.api.Filter;
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class ScrollableWidgetUpdateService extends RemoteViewsService { 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 @Override
public RemoteViewsFactory onGetViewFactory(Intent intent) { public RemoteViewsFactory onGetViewFactory(Intent intent) {
@ -23,8 +26,10 @@ public class ScrollableWidgetUpdateService extends RemoteViewsService {
return null; 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); 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.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
@ -18,7 +17,6 @@ import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.activity.TaskEditActivity; import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListActivity; 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.FilterWithCustomIntent;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.core.CoreFilterExposer; import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.service.AstridDependencyInjector; import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.TagDataService; import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.subtasks.SubtasksHelper;
import com.todoroo.astrid.tags.TagFilterExposer; import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.utility.AstridPreferences; import com.todoroo.astrid.utility.AstridPreferences;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
@ -42,7 +38,11 @@ import com.todoroo.astrid.widget.WidgetUpdateService;
import org.tasks.R; 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 { public class WidgetHelper {
@ -91,7 +91,9 @@ public class WidgetHelper {
public RemoteViews createScrollableWidget(Context context, int id) { public RemoteViews createScrollableWidget(Context context, int id) {
Filter filter = getFilter(context, id); Filter filter = getFilter(context, id);
Intent rvIntent = new Intent(context, ScrollableWidgetUpdateService.class); 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(ScrollableWidgetUpdateService.IS_DARK_THEME, ThemeService.isDarkWidgetTheme());
rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id); rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
rvIntent.setData(Uri.parse(rvIntent.toUri(Intent.URI_INTENT_SCHEME))); rvIntent.setData(Uri.parse(rvIntent.toUri(Intent.URI_INTENT_SCHEME)));
@ -244,21 +246,4 @@ public class WidgetHelper {
return filter; 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