Display caldav and google task subtasks on widget

gtask_related_email
Alex Baker 6 years ago
parent fcef1cb145
commit a85367ab18

@ -28,7 +28,6 @@ public class SortHelper {
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;
private static final String ADJUSTED_DUE_DATE = private static final String ADJUSTED_DUE_DATE =
"(CASE WHEN (dueDate / 1000) % 60 > 0 THEN dueDate ELSE (dueDate + 43140000) END)"; "(CASE WHEN (dueDate / 1000) % 60 > 0 THEN dueDate ELSE (dueDate + 43140000) END)";
private static final Order ORDER_TITLE = Order.asc(Functions.upper(Task.TITLE)); private static final Order ORDER_TITLE = Order.asc(Functions.upper(Task.TITLE));
@ -97,7 +96,6 @@ 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:
default: default:
order = order =
Order.asc( Order.asc(
@ -136,7 +134,6 @@ public class SortHelper {
case SORT_MODIFIED: case SORT_MODIFIED:
select = "tasks.modified AS sort_modified"; select = "tasks.modified AS sort_modified";
break; break;
case SORT_WIDGET:
default: default:
select ="(CASE WHEN (tasks.dueDate=0) " select ="(CASE WHEN (tasks.dueDate=0) "
+ // if no due date + // if no due date
@ -167,7 +164,6 @@ public class SortHelper {
case SORT_MODIFIED: case SORT_MODIFIED:
order = Order.desc("sort_modified"); order = Order.desc("sort_modified");
break; break;
case SORT_WIDGET:
default: default:
order = Order.asc("sort_smart"); order = Order.asc("sort_smart");
} }

@ -16,7 +16,6 @@ import androidx.room.Query;
import androidx.room.RawQuery; import androidx.room.RawQuery;
import androidx.room.Update; import androidx.room.Update;
import androidx.sqlite.db.SimpleSQLiteQuery; import androidx.sqlite.db.SimpleSQLiteQuery;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
@ -216,12 +215,8 @@ public abstract class TaskDao {
} }
private Cursor getCursor(String queryTemplate) { private Cursor getCursor(String queryTemplate) {
return getCursor(queryTemplate, Task.PROPERTIES);
}
public Cursor getCursor(String queryTemplate, Property<?>... properties) {
com.todoroo.andlib.sql.Query query = com.todoroo.andlib.sql.Query query =
com.todoroo.andlib.sql.Query.select(properties) com.todoroo.andlib.sql.Query.select(Task.PROPERTIES)
.withQueryTemplate(PermaSql.replacePlaceholdersForQuery(queryTemplate)); .withQueryTemplate(PermaSql.replacePlaceholdersForQuery(queryTemplate));
String queryString = query.from(Task.TABLE).toString(); String queryString = query.from(Task.TABLE).toString();
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {

@ -100,7 +100,7 @@ public class TaskListViewModel extends ViewModel implements Observer<PagedList<T
tasks.observe(owner, observer); tasks.observe(owner, observer);
} }
private String getQuery(Filter filter) { public static String getQuery(Preferences preferences, Filter filter) {
List<Field> fields = Lists.newArrayList(TASKS, GTASK, CALDAV, GEOFENCE, PLACE); List<Field> fields = Lists.newArrayList(TASKS, GTASK, CALDAV, GEOFENCE, PLACE);
Criterion tagsJoinCriterion = Criterion.and(Task.ID.eq(field(TAGS_METADATA_JOIN + ".task"))); Criterion tagsJoinCriterion = Criterion.and(Task.ID.eq(field(TAGS_METADATA_JOIN + ".task")));
@ -233,7 +233,7 @@ public class TaskListViewModel extends ViewModel implements Observer<PagedList<T
removeObserver(); removeObserver();
SimpleSQLiteQuery query = new SimpleSQLiteQuery(getQuery(filter)); SimpleSQLiteQuery query = new SimpleSQLiteQuery(getQuery(preferences, filter));
Timber.v(query.getSql()); Timber.v(query.getSql());
if (manualSort) { if (manualSort) {
disposable.add( disposable.add(

@ -6,30 +6,30 @@ import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1;
import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Paint; import android.graphics.Paint;
import android.util.DisplayMetrics;
import android.view.View; import android.view.View;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import android.widget.RemoteViewsService; import android.widget.RemoteViewsService;
import com.google.common.collect.ObjectArrays; import androidx.sqlite.db.SimpleSQLiteQuery;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.subtasks.SubtasksHelper; import com.todoroo.astrid.subtasks.SubtasksHelper;
import java.util.ArrayList;
import java.util.List;
import org.tasks.BuildConfig; import org.tasks.BuildConfig;
import org.tasks.R; import org.tasks.R;
import org.tasks.data.GoogleTask; import org.tasks.data.TaskContainer;
import org.tasks.locale.Locale; import org.tasks.locale.Locale;
import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
import org.tasks.themes.WidgetTheme; import org.tasks.themes.WidgetTheme;
import org.tasks.ui.CheckBoxes; import org.tasks.ui.CheckBoxes;
import org.tasks.ui.TaskListViewModel;
import timber.log.Timber; import timber.log.Timber;
class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
@ -42,6 +42,8 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private final Preferences preferences; private final Preferences preferences;
private final WidgetPreferences widgetPreferences; private final WidgetPreferences widgetPreferences;
private final Context context; private final Context context;
private final int widgetPadding;
private final int indentPadding;
private boolean showDueDates; private boolean showDueDates;
private boolean showCheckboxes; private boolean showCheckboxes;
@ -51,7 +53,7 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private int textColorPrimary; private int textColorPrimary;
private int textColorSecondary; private int textColorSecondary;
private Cursor cursor; private List<TaskContainer> tasks = new ArrayList<>();
ScrollableViewsFactory( ScrollableViewsFactory(
SubtasksHelper subtasksHelper, SubtasksHelper subtasksHelper,
@ -68,9 +70,10 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
this.taskDao = taskDao; this.taskDao = taskDao;
this.defaultFilterProvider = defaultFilterProvider; this.defaultFilterProvider = defaultFilterProvider;
this.themeCache = themeCache; this.themeCache = themeCache;
widgetPreferences = new WidgetPreferences(context, preferences, widgetId); widgetPreferences = new WidgetPreferences(context, preferences, widgetId);
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
widgetPadding = (int)(10 * metrics.density);
indentPadding = (int)(20 * metrics.density);
updateSettings(); updateSettings();
} }
@ -79,22 +82,18 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
@Override @Override
public void onDataSetChanged() { public void onDataSetChanged() {
if (cursor != null) { updateSettings();
cursor.close(); String query = getQuery(filter);
} tasks = taskDao.fetchTasks(new SimpleSQLiteQuery(query));
cursor = getCursor();
} }
@Override @Override
public void onDestroy() { public void onDestroy() {
if (cursor != null) {
cursor.close();
}
} }
@Override @Override
public int getCount() { public int getCount() {
return cursor == null ? 0 : cursor.getCount(); return tasks.size();
} }
@Override @Override
@ -114,7 +113,7 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
@Override @Override
public long getItemId(int position) { public long getItemId(int position) {
Task task = getTask(position); TaskContainer task = getTask(position);
return task == null ? 0 : task.getId(); return task == null ? 0 : task.getId();
} }
@ -129,10 +128,11 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private RemoteViews buildUpdate(int position) { private RemoteViews buildUpdate(int position) {
try { try {
Task task = getTask(position); TaskContainer taskContainer = getTask(position);
if (task == null) { if (taskContainer == null) {
return null; return null;
} }
Task task = taskContainer.getTask();
String textContent; String textContent;
int textColorTitle = textColorPrimary; int textColorTitle = textColorPrimary;
@ -179,6 +179,12 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
row.setInt( row.setInt(
R.id.widget_row, "setLayoutDirection", Locale.getInstance(context).getDirectionality()); R.id.widget_row, "setLayoutDirection", Locale.getInstance(context).getDirectionality());
} }
row.setViewPadding(
R.id.widget_row,
widgetPadding + taskContainer.getIndent() * indentPadding,
0,
widgetPadding,
0);
return row; return row;
} catch (Exception e) { } catch (Exception e) {
@ -188,20 +194,11 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
return null; return null;
} }
private Cursor getCursor() { private TaskContainer getTask(int position) {
updateSettings(); return position < tasks.size() ? tasks.get(position) : null;
return taskDao.getCursor(getQuery(filter), getProperties(filter));
}
private Task getTask(int position) {
return cursor != null && cursor.moveToPosition(position) ? new Task(cursor) : null;
} }
private String getQuery(Filter filter) { private String getQuery(Filter filter) {
int sort = preferences.getSortMode();
if (sort == 0) {
sort = SortHelper.SORT_WIDGET;
}
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget); RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget);
rv.setTextViewText(R.id.widget_title, filter.listingTitle); rv.setTextViewText(R.id.widget_title, filter.listingTitle);
@ -209,18 +206,10 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
rv.setInt(R.id.widget, "setLayoutDirection", Locale.getInstance(context).getDirectionality()); rv.setInt(R.id.widget, "setLayoutDirection", Locale.getInstance(context).getDirectionality());
} }
appWidgetManager.partiallyUpdateAppWidget(widgetId, rv); appWidgetManager.partiallyUpdateAppWidget(widgetId, rv);
String query = String query = TaskListViewModel.getQuery(preferences, filter);
SortHelper.adjustQueryForFlagsAndSort(preferences, filter.getSqlQuery(), sort)
.replaceAll("LIMIT \\d+", "");
return subtasksHelper.applySubtasksToWidgetFilter(filter, query); return subtasksHelper.applySubtasksToWidgetFilter(filter, query);
} }
private Property<?>[] getProperties(Filter filter) {
return filter instanceof GtasksFilter
? ObjectArrays.concat(Task.PROPERTIES, new Property<?>[] {GoogleTask.ORDER}, Property.class)
: Task.PROPERTIES;
}
private void formatDueDate(RemoteViews row, Task task) { private void formatDueDate(RemoteViews row, Task task) {
if (task.hasDueDate()) { if (task.hasDueDate()) {
row.setViewVisibility(R.id.widget_due_date, View.VISIBLE); row.setViewVisibility(R.id.widget_due_date, View.VISIBLE);

Loading…
Cancel
Save