New sort selection activity now works, updates the task list as you'd expect.

pull/14/head
Tim Su 14 years ago
parent 796d26955b
commit 0ced4fc3d9

@ -1,30 +1,37 @@
package com.todoroo.andlib.sql; package com.todoroo.andlib.sql;
import static com.todoroo.andlib.sql.SqlConstants.SPACE; import static com.todoroo.andlib.sql.SqlConstants.SPACE;
public class Order { public class Order {
private final Object expression; private final Object expression;
private final OrderType orderType; private final OrderType orderType;
private Order(Object expression) { private Order(Object expression) {
this(expression, OrderType.ASC); this(expression, OrderType.ASC);
} }
private Order(Object expression, OrderType orderType) { private Order(Object expression, OrderType orderType) {
this.expression = expression; this.expression = expression;
this.orderType = orderType; this.orderType = orderType;
} }
public static Order asc(Object expression) { public static Order asc(Object expression) {
return new Order(expression); return new Order(expression);
} }
public static Order desc(Object expression) { public static Order desc(Object expression) {
return new Order(expression, OrderType.DESC); return new Order(expression, OrderType.DESC);
} }
@Override @Override
public String toString() { public String toString() {
return expression + SPACE + orderType; return expression + SPACE + orderType;
} }
}
public Order reverse() {
if(orderType == OrderType.ASC)
return new Order(expression, OrderType.DESC);
else
return new Order(expression, OrderType.ASC);
}
}

@ -70,7 +70,8 @@ public class LocaleReceiver extends BroadcastReceiver {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
Filter filter = new Filter(title, title, null, null); Filter filter = new Filter(title, title, null, null);
filter.sqlQuery = sql; filter.sqlQuery = sql;
TodorooCursor<Task> cursor = PluginServices.getTaskService().fetchFiltered(filter, null, Task.ID); TodorooCursor<Task> cursor = PluginServices.getTaskService().fetchFiltered(
sql, null, Task.ID);
try { try {
if(cursor.getCount() == 0) if(cursor.getCount() == 0)
return; return;

@ -2,7 +2,9 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:paddingLeft="10dip"
android:paddingRight="10dip">
<LinearLayout <LinearLayout
android:layout_width="fill_parent" android:layout_width="fill_parent"
@ -30,10 +32,13 @@
<TextView <TextView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="1dip" android:layout_height="wrap_content"
android:padding="5dip" android:padding="5dip"
android:gravity="center"
android:textSize="20sp"
android:textColor="#ffffff"
android:text="@string/SSD_sort_header" android:text="@string/SSD_sort_header"
style="@style/TextAppearance.FLA_Header" /> android:background="@drawable/edit_titlebar"/>
<RadioGroup <RadioGroup
android:layout_width="fill_parent" android:layout_width="fill_parent"

@ -2,14 +2,42 @@ package com.todoroo.astrid.activity;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.view.View; import android.view.View;
import android.widget.CheckBox;
import android.widget.RadioButton;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.TaskService;
/**
* Shows the sort / hidden dialog
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class SortSelectionActivity { public class SortSelectionActivity {
private SortSelectionActivity() { public static final int FLAG_REVERSE_SORT = 1 << 0;
// use the static method public static final int FLAG_SHOW_COMPLETED = 1 << 1;
public static final int FLAG_SHOW_HIDDEN = 1 << 2;
public static final int FLAG_SHOW_DELETED = 1 << 3;
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 interface OnSortSelectedListener {
public void onSortSelected(boolean always, int flags, int sort);
} }
/** /**
@ -17,18 +45,145 @@ public class SortSelectionActivity {
* @param activity * @param activity
* @return * @return
*/ */
public static AlertDialog createDialog(Activity activity) { public static AlertDialog createDialog(Activity activity,
OnSortSelectedListener listener, int flags, int sort) {
View body = activity.getLayoutInflater().inflate(R.layout.sort_selection_dialog, null); View body = activity.getLayoutInflater().inflate(R.layout.sort_selection_dialog, null);
if((flags & FLAG_REVERSE_SORT) > 0)
((CheckBox)body.findViewById(R.id.reverse)).setChecked(true);
if((flags & FLAG_SHOW_COMPLETED) > 0)
((CheckBox)body.findViewById(R.id.completed)).setChecked(true);
if((flags & FLAG_SHOW_HIDDEN) > 0)
((CheckBox)body.findViewById(R.id.hidden)).setChecked(true);
if((flags & FLAG_SHOW_DELETED) > 0)
((CheckBox)body.findViewById(R.id.deleted)).setChecked(true);
switch(sort) {
case SORT_ALPHA:
((RadioButton)body.findViewById(R.id.sort_alpha)).setChecked(true);
break;
case SORT_DUE:
((RadioButton)body.findViewById(R.id.sort_due)).setChecked(true);
break;
case SORT_IMPORTANCE:
((RadioButton)body.findViewById(R.id.sort_importance)).setChecked(true);
break;
case SORT_MODIFIED:
((RadioButton)body.findViewById(R.id.sort_modified)).setChecked(true);
break;
default:
((RadioButton)body.findViewById(R.id.sort_smart)).setChecked(true);
}
AlertDialog dialog = new AlertDialog.Builder(activity). AlertDialog dialog = new AlertDialog.Builder(activity).
setTitle(R.string.SSD_title). setTitle(R.string.SSD_title).
setIcon(android.R.drawable.ic_menu_sort_by_size). setIcon(android.R.drawable.ic_menu_sort_by_size).
setView(body). setView(body).
setPositiveButton(R.string.SSD_save_always, null). setPositiveButton(R.string.SSD_save_always,
setNegativeButton(R.string.SSD_save_temp, null). new DialogOkListener(body, listener, true)).
setNegativeButton(R.string.SSD_save_temp,
new DialogOkListener(body, listener, false)).
create(); create();
dialog.setOwnerActivity(activity); dialog.setOwnerActivity(activity);
return dialog; return dialog;
} }
@SuppressWarnings("nls")
public static String adjustSortAndFlags(String originalSql, int flags, int sort) {
// sort
if(!originalSql.toUpperCase().contains("ORDER BY")) {
Order order;
switch(sort) {
case SortSelectionActivity.SORT_ALPHA:
order = Order.asc(Functions.upper(Task.TITLE));
break;
case SortSelectionActivity.SORT_DUE:
order = Order.asc(Functions.caseStatement(Task.DUE_DATE.eq(0),
DateUtilities.now()*2, Task.DUE_DATE) + "+" + Task.IMPORTANCE);
break;
case SortSelectionActivity.SORT_IMPORTANCE:
order = Order.asc(Task.IMPORTANCE + "*" + (2*DateUtilities.now()) + //$NON-NLS-1$
"+" + Functions.caseStatement(Task.DUE_DATE.eq(0), //$NON-NLS-1$
Functions.now() + "+" + DateUtilities.ONE_WEEK, //$NON-NLS-1$
Task.DUE_DATE));
break;
case SortSelectionActivity.SORT_MODIFIED:
order = Order.desc(Task.MODIFICATION_DATE);
break;
default:
order = TaskService.defaultTaskOrder();
}
if((flags & SortSelectionActivity.FLAG_REVERSE_SORT) > 0)
order = order.reverse();
originalSql += " ORDER BY " + order;
}
// flags
if((flags & FLAG_SHOW_COMPLETED) > 0)
originalSql = originalSql.replace(Task.COMPLETION_DATE.eq(0).toString(),
Criterion.all.toString());
if((flags & FLAG_SHOW_HIDDEN) > 0)
originalSql = originalSql.replace(TaskCriteria.isVisible().toString(),
Criterion.all.toString());
if((flags & FLAG_SHOW_DELETED) > 0)
originalSql = originalSql.replace(Task.DELETION_DATE.eq(0).toString(),
Criterion.all.toString());
return originalSql;
}
// --- internal implementation
/** preference key for sort flags */
public static final String PREF_SORT_FLAGS = "tla_flags"; //$NON-NLS-1$
/** preference key for sort sort */
public static final String PREF_SORT_SORT = "tla_sort"; //$NON-NLS-1$
private SortSelectionActivity() {
// use the static method
}
private static class DialogOkListener implements OnClickListener {
private final OnSortSelectedListener listener;
private final boolean always;
private final View body;
public DialogOkListener(View body, OnSortSelectedListener listener, boolean always) {
this.body = body;
this.listener = listener;
this.always = always;
}
@Override
public void onClick(DialogInterface view, int button) {
int flags = 0;
int sort = 0;
if(((CheckBox)body.findViewById(R.id.reverse)).isChecked())
flags |= FLAG_REVERSE_SORT;
if(((CheckBox)body.findViewById(R.id.completed)).isChecked())
flags |= FLAG_SHOW_COMPLETED;
if(((CheckBox)body.findViewById(R.id.hidden)).isChecked())
flags |= FLAG_SHOW_HIDDEN;
if(((CheckBox)body.findViewById(R.id.deleted)).isChecked())
flags |= FLAG_SHOW_DELETED;
if(((RadioButton)body.findViewById(R.id.sort_alpha)).isChecked())
sort = SORT_ALPHA;
else if(((RadioButton)body.findViewById(R.id.sort_due)).isChecked())
sort = SORT_DUE;
else if(((RadioButton)body.findViewById(R.id.sort_importance)).isChecked())
sort = SORT_IMPORTANCE;
else if(((RadioButton)body.findViewById(R.id.sort_modified)).isChecked())
sort = SORT_MODIFIED;
else
sort = SORT_AUTO;
listener.onSortSelected(always, flags, sort);
}
}
} }

@ -3,6 +3,7 @@ package com.todoroo.astrid.activity;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicReference;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.ListActivity; import android.app.ListActivity;
@ -48,6 +49,7 @@ import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
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.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
@ -56,6 +58,7 @@ import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Pair; import com.todoroo.andlib.utility.Pair;
import com.todoroo.andlib.widget.GestureService; import com.todoroo.andlib.widget.GestureService;
import com.todoroo.andlib.widget.GestureService.GestureInterface; import com.todoroo.andlib.widget.GestureService.GestureInterface;
import com.todoroo.astrid.activity.SortSelectionActivity.OnSortSelectedListener;
import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter.ViewHolder; import com.todoroo.astrid.adapter.TaskAdapter.ViewHolder;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
@ -80,6 +83,8 @@ import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Flags; import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.utility.Preferences;
import com.todoroo.astrid.widget.TasksWidget;
/** /**
* Primary activity for the Bente application. Shows a list of upcoming * Primary activity for the Bente application. Shows a list of upcoming
@ -88,7 +93,8 @@ import com.todoroo.astrid.utility.Flags;
* @author Tim Su <tim@todoroo.com> * @author Tim Su <tim@todoroo.com>
* *
*/ */
public class TaskListActivity extends ListActivity implements OnScrollListener, GestureInterface { public class TaskListActivity extends ListActivity implements OnScrollListener,
GestureInterface, OnSortSelectedListener {
// --- activities // --- activities
@ -145,6 +151,9 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
ImageButton quickAddButton; ImageButton quickAddButton;
EditText quickAddBox; EditText quickAddBox;
Filter filter; Filter filter;
int sortFlags;
int sortSort;
AtomicReference<String> sqlQueryTemplate = new AtomicReference<String>();
/* ====================================================================== /* ======================================================================
* ======================================================= initialization * ======================================================= initialization
@ -515,21 +524,18 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
* Fill in the Task List with current items * Fill in the Task List with current items
* @param withCustomId force task with given custom id to be part of list * @param withCustomId force task with given custom id to be part of list
*/ */
@SuppressWarnings("nls")
protected void setUpTaskList() { protected void setUpTaskList() {
// use default ordering if none specified sqlQueryTemplate.set(SortSelectionActivity.adjustSortAndFlags(filter.sqlQuery,
if(!filter.sqlQuery.toUpperCase().contains("ORDER BY")) { sortFlags, sortSort));
filter.sqlQuery += " ORDER BY " + TaskService.defaultTaskOrder();
}
// perform query // perform query
TodorooCursor<Task> currentCursor = taskService.fetchFiltered( TodorooCursor<Task> currentCursor = taskService.fetchFiltered(
filter, null, TaskAdapter.PROPERTIES); sqlQueryTemplate.get(), null, TaskAdapter.PROPERTIES);
startManagingCursor(currentCursor); startManagingCursor(currentCursor);
// set up list adapters // set up list adapters
taskAdapter = new TaskAdapter(this, R.layout.task_adapter_row, taskAdapter = new TaskAdapter(this, R.layout.task_adapter_row,
currentCursor, filter, false, null); currentCursor, sqlQueryTemplate, false, null);
setListAdapter(taskAdapter); setListAdapter(taskAdapter);
getListView().setOnScrollListener(this); getListView().setOnScrollListener(this);
registerForContextMenu(getListView()); registerForContextMenu(getListView());
@ -555,14 +561,13 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
} }
// create a custom cursor // create a custom cursor
if(filter.sqlQuery == null) if(!sqlQueryTemplate.get().contains("WHERE"))
filter.sqlQuery = ""; sqlQueryTemplate.set(sqlQueryTemplate.get() + " WHERE " + TaskCriteria.byId(withCustomId));
if(!filter.sqlQuery.contains("WHERE"))
filter.sqlQuery += " WHERE " + TaskCriteria.byId(withCustomId);
else else
filter.sqlQuery = filter.sqlQuery.replace("WHERE ", "WHERE " + sqlQueryTemplate.set(sqlQueryTemplate.get().replace("WHERE ", "WHERE " +
TaskCriteria.byId(withCustomId) + " OR "); TaskCriteria.byId(withCustomId) + " OR "));
currentCursor = taskService.fetchFiltered(filter, null, TaskAdapter.PROPERTIES);
currentCursor = taskService.fetchFiltered(sqlQueryTemplate.get(), null, TaskAdapter.PROPERTIES);
getListView().setFilterText(""); getListView().setFilterText("");
startManagingCursor(currentCursor); startManagingCursor(currentCursor);
@ -724,7 +729,8 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
startActivityForResult(intent, ACTIVITY_SETTINGS); startActivityForResult(intent, ACTIVITY_SETTINGS);
return true; return true;
case MENU_SORT_ID: case MENU_SORT_ID:
AlertDialog dialog = SortSelectionActivity.createDialog(this); AlertDialog dialog = SortSelectionActivity.createDialog(this,
this, sortFlags, sortSort);
dialog.show(); dialog.show();
return true; return true;
case MENU_HELP_ID: case MENU_HELP_ID:
@ -815,4 +821,19 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
} }
} }
@Override
public void onSortSelected(boolean always, int flags, int sort) {
sortFlags = flags;
sortSort = sort;
if(always) {
Preferences.setInt(SortSelectionActivity.PREF_SORT_FLAGS, flags);
Preferences.setInt(SortSelectionActivity.PREF_SORT_SORT, sort);
ContextManager.getContext().startService(new Intent(ContextManager.getContext(),
TasksWidget.UpdateService.class));
}
setUpTaskList();
}
} }

@ -5,6 +5,7 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import android.app.ListActivity; import android.app.ListActivity;
import android.content.Context; import android.content.Context;
@ -15,12 +16,12 @@ import android.graphics.Paint;
import android.text.Html; import android.text.Html;
import android.text.util.Linkify; import android.text.util.Linkify;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener; import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.LayoutParams;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
@ -42,7 +43,6 @@ import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.alarms.AlarmDetailExposer; import com.todoroo.astrid.alarms.AlarmDetailExposer;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.DetailExposer; import com.todoroo.astrid.api.DetailExposer;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.TaskAction; import com.todoroo.astrid.api.TaskAction;
import com.todoroo.astrid.api.TaskDecoration; import com.todoroo.astrid.api.TaskDecoration;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
@ -109,7 +109,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
private final LayoutInflater inflater; private final LayoutInflater inflater;
private int fontSize; private int fontSize;
private final Filter filter; private final AtomicReference<String> query;
// the task that's expanded // the task that's expanded
private long expanded = -1; private long expanded = -1;
@ -136,7 +136,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
* task listener. can be null * task listener. can be null
*/ */
public TaskAdapter(ListActivity activity, int resource, public TaskAdapter(ListActivity activity, int resource,
Cursor c, Filter filter, boolean autoRequery, Cursor c, AtomicReference<String> query, boolean autoRequery,
OnCompletedTaskListener onCompletedTaskListener) { OnCompletedTaskListener onCompletedTaskListener) {
super(activity, c, autoRequery); super(activity, c, autoRequery);
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
@ -144,7 +144,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
inflater = (LayoutInflater) activity.getSystemService( inflater = (LayoutInflater) activity.getSystemService(
Context.LAYOUT_INFLATER_SERVICE); Context.LAYOUT_INFLATER_SERVICE);
this.filter = filter; this.query = query;
this.resource = resource; this.resource = resource;
this.activity = activity; this.activity = activity;
this.onCompletedTaskListener = onCompletedTaskListener; this.onCompletedTaskListener = onCompletedTaskListener;
@ -169,7 +169,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
// perform query // perform query
TodorooCursor<Task> newCursor = taskService.fetchFiltered( TodorooCursor<Task> newCursor = taskService.fetchFiltered(
filter, constraint, TaskAdapter.PROPERTIES); query.get(), constraint, TaskAdapter.PROPERTIES);
activity.startManagingCursor(newCursor); activity.startManagingCursor(newCursor);
return newCursor; return newCursor;
} }

@ -9,10 +9,9 @@ import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
@ -157,14 +156,14 @@ public class TaskService {
* @return * @return
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
public TodorooCursor<Task> fetchFiltered(Filter filter, CharSequence constraint, public TodorooCursor<Task> fetchFiltered(String queryTemplate, CharSequence constraint,
Property<?>... properties) { Property<?>... properties) {
Criterion whereConstraint = null; Criterion whereConstraint = null;
if(constraint != null) if(constraint != null)
whereConstraint = Functions.upper(Task.TITLE).like("%" + whereConstraint = Functions.upper(Task.TITLE).like("%" +
constraint.toString().toUpperCase() + "%"); constraint.toString().toUpperCase() + "%");
if(filter == null || filter.sqlQuery == null) { if(queryTemplate == null) {
if(whereConstraint == null) if(whereConstraint == null)
return taskDao.query(Query.select(properties)); return taskDao.query(Query.select(properties));
else else
@ -173,12 +172,13 @@ public class TaskService {
String sql; String sql;
if(whereConstraint != null) { if(whereConstraint != null) {
if(!filter.sqlQuery.toUpperCase().contains("WHERE")) if(!queryTemplate.toUpperCase().contains("WHERE"))
sql = filter.sqlQuery + " WHERE " + whereConstraint; sql = queryTemplate + " WHERE " + whereConstraint;
else else
sql = filter.sqlQuery.replace("WHERE ", "WHERE " + whereConstraint + " AND "); sql = queryTemplate.replace("WHERE ", "WHERE " + whereConstraint + " AND ");
} else } else
sql = filter.sqlQuery; sql = queryTemplate;
return taskDao.query(Query.select(properties).withQueryTemplate(sql)); return taskDao.query(Query.select(properties).withQueryTemplate(sql));
} }

@ -224,6 +224,31 @@ public class Preferences {
editor.commit(); editor.commit();
} }
// --- preference fetching (int)
/** Gets a int preference
*
* @param key
* @param defValue
* @return default if value is unset otherwise the value
*/
public static int getInt(String key, int defValue) {
Context context = ContextManager.getContext();
return getPrefs(context).getInt(key, defValue);
}
/**
* Sets int preference
* @param key
* @param value
*/
public static void setInt(String key, int value) {
Context context = ContextManager.getContext();
Editor editor = getPrefs(context).edit();
editor.putInt(key, value);
editor.commit();
}
// --- preference fetching (long) // --- preference fetching (long)
/** Gets a long preference /** Gets a long preference

@ -1,146 +1,151 @@
package com.todoroo.astrid.widget; package com.todoroo.astrid.widget;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider; import android.appwidget.AppWidgetProvider;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import android.os.IBinder; import android.os.IBinder;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import com.timsu.astrid.R; import com.timsu.astrid.R;
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.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskEditActivity; import com.todoroo.astrid.activity.SortSelectionActivity;
import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.core.CoreFilterExposer; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.service.AstridDependencyInjector; import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.TaskService;
public class TasksWidget extends AppWidgetProvider { import com.todoroo.astrid.utility.Preferences;
static { public class TasksWidget extends AppWidgetProvider {
AstridDependencyInjector.initialize();
} static {
AstridDependencyInjector.initialize();
public final static int[] TEXT_IDS = { R.id.task_1, R.id.task_2, }
R.id.task_3, R.id.task_4, R.id.task_5 };
public final static int[] SEPARATOR_IDS = { R.id.separator_1, public final static int[] TEXT_IDS = { R.id.task_1, R.id.task_2,
R.id.separator_2, R.id.separator_3, R.id.separator_4 }; R.id.task_3, R.id.task_4, R.id.task_5 };
public final static int[] SEPARATOR_IDS = { R.id.separator_1,
@Override R.id.separator_2, R.id.separator_3, R.id.separator_4 };
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) { @Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
try { int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
try {
// Start in service to prevent Application Not Responding timeout super.onUpdate(context, appWidgetManager, appWidgetIds);
context.startService(new Intent(context, UpdateService.class));
} catch (SecurityException e) { // Start in service to prevent Application Not Responding timeout
// :( context.startService(new Intent(context, UpdateService.class));
} } catch (SecurityException e) {
} // :(
}
public static class UpdateService extends Service { }
@Autowired public static class UpdateService extends Service {
Database database;
@Autowired
@Autowired Database database;
TaskService taskService;
@Autowired
@Override TaskService taskService;
public void onStart(Intent intent, int startId) {
ContextManager.setContext(this); @Override
RemoteViews updateViews = buildUpdate(this); public void onStart(Intent intent, int startId) {
ContextManager.setContext(this);
ComponentName thisWidget = new ComponentName(this, RemoteViews updateViews = buildUpdate(this);
TasksWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this); ComponentName thisWidget = new ComponentName(this,
manager.updateAppWidget(thisWidget, updateViews); TasksWidget.class);
} AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, updateViews);
@Override }
public IBinder onBind(Intent intent) {
return null; @Override
} public IBinder onBind(Intent intent) {
return null;
@SuppressWarnings("nls") }
public RemoteViews buildUpdate(Context context) {
DependencyInjectionService.getInstance().inject(this); @SuppressWarnings("nls")
public RemoteViews buildUpdate(Context context) {
RemoteViews views = null; DependencyInjectionService.getInstance().inject(this);
views = new RemoteViews(context.getPackageName(), RemoteViews views = null;
R.layout.widget_initialized);
views = new RemoteViews(context.getPackageName(),
int[] textIDs = TEXT_IDS; R.layout.widget_initialized);
int[] separatorIDs = SEPARATOR_IDS;
int numberOfTasks = 5; int[] textIDs = TEXT_IDS;
int[] separatorIDs = SEPARATOR_IDS;
Intent listIntent = new Intent(context, TaskListActivity.class); int numberOfTasks = 5;
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
listIntent, 0); Intent listIntent = new Intent(context, TaskListActivity.class);
views.setOnClickPendingIntent(R.id.taskbody, pendingIntent); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
listIntent, 0);
TodorooCursor<Task> cursor = null; views.setOnClickPendingIntent(R.id.taskbody, pendingIntent);
try {
Filter inboxFilter = CoreFilterExposer.buildInboxFilter(getResources()); TodorooCursor<Task> cursor = null;
inboxFilter.sqlQuery += "ORDER BY " + TaskService.defaultTaskOrder() + " LIMIT " + numberOfTasks; try {
Filter inboxFilter = CoreFilterExposer.buildInboxFilter(getResources());
database.openForReading(); int sort = Preferences.getInt(SortSelectionActivity.PREF_SORT_SORT, 0);
cursor = taskService.fetchFiltered(inboxFilter, null, Task.TITLE, Task.DUE_DATE); int flags = Preferences.getInt(SortSelectionActivity.PREF_SORT_FLAGS, 0);
Task task = new Task(); String query = SortSelectionActivity.adjustSortAndFlags(
for (int i = 0; i < cursor.getCount() && i < numberOfTasks; i++) { inboxFilter.sqlQuery, sort, flags) + " LIMIT " + numberOfTasks;
cursor.moveToPosition(i);
task.readFromCursor(cursor); database.openForReading();
cursor = taskService.fetchFiltered(query, null, Task.TITLE, Task.DUE_DATE);
String textContent = ""; Task task = new Task();
int textColor = Color.WHITE; for (int i = 0; i < cursor.getCount() && i < numberOfTasks; i++) {
cursor.moveToPosition(i);
textContent = task.getValue(Task.TITLE); task.readFromCursor(cursor);
if(task.hasDueDate() && task.getValue(Task.DUE_DATE) < DateUtilities.now())
textColor = context.getResources().getColor(R.color.task_list_overdue); String textContent = "";
int textColor = Color.WHITE;
if(i > 0)
views.setViewVisibility(separatorIDs[i-1], View.VISIBLE); textContent = task.getValue(Task.TITLE);
views.setTextViewText(textIDs[i], textContent); if(task.hasDueDate() && task.getValue(Task.DUE_DATE) < DateUtilities.now())
views.setTextColor(textIDs[i], textColor); textColor = context.getResources().getColor(R.color.task_list_overdue);
}
if(i > 0)
for(int i = cursor.getCount() - 1; i < separatorIDs.length; i++) { views.setViewVisibility(separatorIDs[i-1], View.VISIBLE);
if(i >= 0) views.setTextViewText(textIDs[i], textContent);
views.setViewVisibility(separatorIDs[i], View.INVISIBLE); views.setTextColor(textIDs[i], textColor);
if(i > cursor.getCount() - 1) }
views.setViewVisibility(textIDs[i], View.INVISIBLE);
} for(int i = cursor.getCount() - 1; i < separatorIDs.length; i++) {
} catch (Exception e) { if(i >= 0)
// can happen if database is not ready views.setViewVisibility(separatorIDs[i], View.INVISIBLE);
Log.e("WIDGET-UPDATE", "Error updating widget", e); if(i > cursor.getCount() - 1)
} finally { views.setViewVisibility(textIDs[i], View.INVISIBLE);
if(cursor != null) }
cursor.close(); } catch (Exception e) {
} // can happen if database is not ready
Log.e("WIDGET-UPDATE", "Error updating widget", e);
Intent editIntent = new Intent(context, TaskEditActivity.class); } finally {
pendingIntent = PendingIntent.getActivity(context, 0, if(cursor != null)
editIntent, 0); cursor.close();
views.setOnClickPendingIntent(R.id.widget_button, pendingIntent); }
return views; Intent editIntent = new Intent(context, TaskEditActivity.class);
} pendingIntent = PendingIntent.getActivity(context, 0,
editIntent, 0);
} views.setOnClickPendingIntent(R.id.widget_button, pendingIntent);
}
return views;
}
}
}

Loading…
Cancel
Save