Complete tasks from scrolling widget

pull/46/merge
Alex Baker 11 years ago
parent 7f2c03a430
commit 5b5668f426

@ -199,6 +199,8 @@
android:label="@string/widget_mini">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.todoroo.astrid.widget.TasksWidget.COMPLETE_TASK"/>
<action android:name="com.todoroo.astrid.widget.TasksWidget.EDIT_TASK"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"

@ -175,11 +175,11 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
R.drawable.check_box_repeat_checked_4,
};
private static final Drawable[] IMPORTANCE_DRAWABLES = new Drawable[IMPORTANCE_RESOURCES.length];
private static final Drawable[] IMPORTANCE_DRAWABLES_CHECKED = new Drawable[IMPORTANCE_RESOURCES_CHECKED.length];
public static final Drawable[] IMPORTANCE_DRAWABLES = new Drawable[IMPORTANCE_RESOURCES.length];
public static final Drawable[] IMPORTANCE_DRAWABLES_CHECKED = new Drawable[IMPORTANCE_RESOURCES_CHECKED.length];
private static final Drawable[] IMPORTANCE_DRAWABLES_LARGE = new Drawable[IMPORTANCE_RESOURCES_LARGE.length];
private static final Drawable[] IMPORTANCE_REPEAT_DRAWABLES = new Drawable[IMPORTANCE_REPEAT_RESOURCES.length];
private static final Drawable[] IMPORTANCE_REPEAT_DRAWABLES_CHECKED = new Drawable[IMPORTANCE_REPEAT_RESOURCES_CHECKED.length];
public static final Drawable[] IMPORTANCE_REPEAT_DRAWABLES = new Drawable[IMPORTANCE_REPEAT_RESOURCES.length];
public static final Drawable[] IMPORTANCE_REPEAT_DRAWABLES_CHECKED = new Drawable[IMPORTANCE_REPEAT_RESOURCES_CHECKED.length];
// --- instance variables

@ -14,19 +14,63 @@ import android.content.Intent;
import android.os.Build;
import android.util.Log;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.utility.AstridPreferences;
import org.tasks.R;
import org.tasks.widget.WidgetHelper;
public class TasksWidget extends AppWidgetProvider {
static {
AstridDependencyInjector.initialize();
}
@Autowired
private TaskService taskService;
public static final String COMPLETE_TASK = "COMPLETE_TASK";
public static final String EDIT_TASK = "EDIT_TASK";
public static long suppressUpdateFlag = 0; // Timestamp--don't update widgets if this flag is non-zero and now() is within 5 minutes
private static final long SUPPRESS_TIME = DateUtilities.ONE_MINUTE * 5;
private static final WidgetHelper widgetHelper = new WidgetHelper();
public TasksWidget() {
super();
DependencyInjectionService.getInstance().inject(this);
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(COMPLETE_TASK)) {
Task task = taskService.fetchById(intent.getLongExtra(TaskEditFragment.TOKEN_ID, 0), Task.ID, Task.COMPLETION_DATE);
taskService.setComplete(task, !task.isCompleted());
} else if(intent.getAction().equals(EDIT_TASK)) {
if(AstridPreferences.useTabletLayout(context)) {
intent.setClass(context, TaskListActivity.class);
} else {
intent.setClass(context, TaskEditActivity.class);
}
intent.setFlags(WidgetHelper.flags);
intent.putExtra(TaskEditFragment.OVERRIDE_FINISH_ANIM, false);
context.startActivity(intent);
} else {
super.onReceive(context, intent);
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
try {

@ -5,6 +5,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
@ -12,13 +13,13 @@ 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.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.widget.TasksWidget;
import org.tasks.R;
@ -91,6 +92,22 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
return true;
}
private int getCheckbox(Task task) {
boolean completed = task.isCompleted();
int value = task.getValue(Task.IMPORTANCE);
if (value >= TaskAdapter.IMPORTANCE_RESOURCES.length) {
value = TaskAdapter.IMPORTANCE_RESOURCES.length - 1;
}
int[] boxes;
if (!TextUtils.isEmpty(task.getValue(Task.RECURRENCE))) {
boxes = completed ? TaskAdapter.IMPORTANCE_REPEAT_RESOURCES_CHECKED : TaskAdapter.IMPORTANCE_REPEAT_RESOURCES;
} else {
boxes = completed ? TaskAdapter.IMPORTANCE_RESOURCES_CHECKED : TaskAdapter.IMPORTANCE_RESOURCES;
}
return boxes[value];
}
public RemoteViews buildUpdate(int position) {
try {
Task task = getTask(position);
@ -111,11 +128,17 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
row.setTextViewText(R.id.text, textContent);
row.setTextColor(R.id.text, textColor);
row.setImageViewResource(R.id.completeBox, getCheckbox(task));
Intent editIntent = new Intent();
editIntent.setAction(TasksWidget.EDIT_TASK);
editIntent.putExtra(TaskEditFragment.TOKEN_ID, task.getId());
row.setOnClickFillInIntent(R.id.text, editIntent);
Intent intent = new Intent(context, TaskEditActivity.class);
intent.putExtra(TaskEditFragment.TOKEN_ID, task.getId());
intent.putExtra(TaskListActivity.OPEN_TASK, task.getId());
row.setOnClickFillInIntent(R.id.text, intent);
Intent completeIntent = new Intent();
completeIntent.setAction(TasksWidget.COMPLETE_TASK);
completeIntent.putExtra(TaskEditFragment.TOKEN_ID, task.getId());
row.setOnClickFillInIntent(R.id.completeBox, completeIntent);
return row;
} catch (Exception e) {
@ -127,7 +150,7 @@ public class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFac
}
private TodorooCursor<Task> getCursor() {
return taskService.fetchFiltered(query, null, Task.ID, Task.TITLE, Task.DUE_DATE, Task.COMPLETION_DATE);
return taskService.fetchFiltered(query, null, Task.ID, Task.TITLE, Task.DUE_DATE, Task.COMPLETION_DATE, Task.IMPORTANCE, Task.RECURRENCE);
}
private Task getTask(int position) {

@ -50,13 +50,12 @@ public class WidgetHelper {
AstridDependencyInjector.initialize();
}
private static int flags = FLAG_ACTIVITY_NEW_TASK
public static int flags = FLAG_ACTIVITY_NEW_TASK
| FLAG_ACTIVITY_MULTIPLE_TASK
| FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
| FLAG_ACTIVITY_NO_HISTORY
| FLAG_ACTIVITY_PREVIOUS_IS_TOP;
public static void startWidgetService(Context context) {
Class widgetServiceClass = android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH
? WidgetUpdateService.class
@ -142,19 +141,14 @@ public class WidgetHelper {
}
private PendingIntent getEditTaskIntent(Context context, Filter filter, int widgetId) {
Intent intent;
Intent intent = new Intent(context, TasksWidget.class);
if (AstridPreferences.useTabletLayout(context)) {
intent = new Intent(context, TaskListActivity.class);
if (filter != null && filter instanceof FilterWithCustomIntent) {
Bundle customExtras = ((FilterWithCustomIntent) filter).customExtras;
intent.putExtras(customExtras);
}
} else {
intent = new Intent(context, TaskEditActivity.class);
}
intent.setFlags(flags);
intent.putExtra(TaskEditFragment.OVERRIDE_FINISH_ANIM, false);
return PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
return PendingIntent.getBroadcast(context, -widgetId, intent, 0);
}
public PendingIntent getNewTaskIntent(Context context, Filter filter, int id) {

@ -1,19 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
** Copyright (c) 2012 Todoroo Inc
**
** See the file "LICENSE" for the full license governing this code.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/text"
android:background="@android:color/transparent"
android:paddingLeft="5dip"
android:paddingTop="5dip"
android:paddingBottom="2dip"
android:paddingRight="5dip"
style="@style/TextAppearance.Widget"
android:singleLine="true">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:minHeight="35dp">
</TextView>
<ImageView
android:id="@+id/completeBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|center_horizontal"/>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingLeft="5dp"
android:id="@+id/text"
android:background="@android:color/transparent"
style="@style/TextAppearance.Widget"
android:singleLine="true"/>
</LinearLayout>
Loading…
Cancel
Save