From 938121f75e11e205f6195149bb12fe1306b916d6 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 20 Nov 2013 16:42:57 -0600 Subject: [PATCH] Show recently completed tasks on widget --- .../com/todoroo/astrid/core/SortHelper.java | 18 +++++++ .../tasks/widget/ScrollableViewsFactory.java | 53 ++++++++++++++++--- .../widget/ScrollableWidgetUpdateService.java | 13 +++-- .../java/org/tasks/widget/WidgetHelper.java | 31 +++-------- 4 files changed, 81 insertions(+), 34 deletions(-) diff --git a/api/src/main/java/com/todoroo/astrid/core/SortHelper.java b/api/src/main/java/com/todoroo/astrid/core/SortHelper.java index dda8f0bca..da68123f8 100644 --- a/api/src/main/java/com/todoroo/astrid/core/SortHelper.java +++ b/api/src/main/java/com/todoroo/astrid/core/SortHelper.java @@ -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)"; } diff --git a/astrid/src/main/java/org/tasks/widget/ScrollableViewsFactory.java b/astrid/src/main/java/org/tasks/widget/ScrollableViewsFactory.java index ea2ca567e..e02840096 100644 --- a/astrid/src/main/java/org/tasks/widget/ScrollableViewsFactory.java +++ b/astrid/src/main/java/org/tasks/widget/ScrollableViewsFactory.java @@ -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 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 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); + } } diff --git a/astrid/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java b/astrid/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java index 506f938e1..bb63e559e 100644 --- a/astrid/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java +++ b/astrid/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java @@ -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); } } diff --git a/astrid/src/main/java/org/tasks/widget/WidgetHelper.java b/astrid/src/main/java/org/tasks/widget/WidgetHelper.java index c28f26830..0b8269518 100644 --- a/astrid/src/main/java/org/tasks/widget/WidgetHelper.java +++ b/astrid/src/main/java/org/tasks/widget/WidgetHelper.java @@ -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); - } }