Merge remote-tracking branch 'sbosley/110808_gtasks_clear_completed'

pull/14/head
Tim Su 15 years ago
commit 5b8ef914d0

@ -22,7 +22,7 @@
<classpathentry exported="true" kind="lib" path="libs/jackson-core-asl-1.6.7.jar"/> <classpathentry exported="true" kind="lib" path="libs/jackson-core-asl-1.6.7.jar"/>
<classpathentry exported="true" kind="lib" path="libs/google-api-client-googleapis-extensions-android2-1.4.1-beta.jar"/> <classpathentry exported="true" kind="lib" path="libs/google-api-client-googleapis-extensions-android2-1.4.1-beta.jar"/>
<classpathentry exported="true" kind="lib" path="libs/google-api-client-extensions-android2-1.4.1-beta.jar"/> <classpathentry exported="true" kind="lib" path="libs/google-api-client-extensions-android2-1.4.1-beta.jar"/>
<classpathentry kind="src" path="astridApi_src"/>
<classpathentry kind="src" path="facebook_src"/> <classpathentry kind="src" path="facebook_src"/>
<classpathentry kind="src" path="astridApi_src"/>
<classpathentry kind="output" path="ecbuild"/> <classpathentry kind="output" path="ecbuild"/>
</classpath> </classpath>

@ -62,7 +62,7 @@ public class GtasksFilterExposer extends BroadcastReceiver {
ContextManager.getString(R.string.gtasks_FEx_title, listName), new QueryTemplate().join( ContextManager.getString(R.string.gtasks_FEx_title, listName), new QueryTemplate().join(
Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and( Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(Criterion.and(
MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY),
TaskCriteria.activeAndVisible(), TaskCriteria.notDeleted(),
GtasksMetadata.LIST_ID.eq(list.getValue(GtasksList.REMOTE_ID)))).orderBy( GtasksMetadata.LIST_ID.eq(list.getValue(GtasksList.REMOTE_ID)))).orderBy(
Order.asc(Functions.cast(GtasksMetadata.ORDER, "LONG"))).groupBy(Task.ID), //$NON-NLS-1$ Order.asc(Functions.cast(GtasksMetadata.ORDER, "LONG"))).groupBy(Task.ID), //$NON-NLS-1$
values); values);

@ -1,20 +1,29 @@
package com.todoroo.astrid.gtasks; package com.todoroo.astrid.gtasks;
import android.app.ProgressDialog;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import com.commonsware.cwac.tlv.TouchListView; import com.commonsware.cwac.tlv.TouchListView;
import com.commonsware.cwac.tlv.TouchListView.DropListener; import com.commonsware.cwac.tlv.TouchListView.DropListener;
import com.commonsware.cwac.tlv.TouchListView.SwipeListener; import com.commonsware.cwac.tlv.TouchListView.SwipeListener;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.activity.DraggableTaskListActivity; import com.todoroo.astrid.activity.DraggableTaskListActivity;
import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.sync.GtasksSyncOnSaveService; import com.todoroo.astrid.gtasks.sync.GtasksSyncOnSaveService;
public class GtasksListActivity extends DraggableTaskListActivity { public class GtasksListActivity extends DraggableTaskListActivity {
protected static final int MENU_CLEAR_COMPLETED_ID = MENU_ADDON_INTENT_ID + 1;
@Autowired private GtasksTaskListUpdater gtasksTaskListUpdater; @Autowired private GtasksTaskListUpdater gtasksTaskListUpdater;
@Autowired private GtasksSyncOnSaveService gtasksSyncOnSaveService; @Autowired private GtasksSyncOnSaveService gtasksSyncOnSaveService;
@ -40,6 +49,13 @@ public class GtasksListActivity extends DraggableTaskListActivity {
android.R.drawable.ic_dialog_info, android.R.drawable.ic_dialog_info,
getString(R.string.gtasks_help_body), null); getString(R.string.gtasks_help_body), null);
} }
taskAdapter.addOnCompletedTaskListener(new OnCompletedTaskListener() {
@Override
public void onCompletedTask(Task item, boolean newState) {
setCompletedForItemAndSubtasks(item, newState);
}
});
} }
private final TouchListView.DropListener dropListener = new DropListener() { private final TouchListView.DropListener dropListener = new DropListener() {
@ -75,4 +91,101 @@ public class GtasksListActivity extends DraggableTaskListActivity {
} }
}; };
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem item = menu.add(Menu.NONE, MENU_CLEAR_COMPLETED_ID, Menu.FIRST, this.getString(R.string.gtasks_GTA_clear_completed));
item.setIcon(android.R.drawable.ic_input_delete); // Needs new icon
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, final MenuItem item) {
if (item.getItemId() == MENU_CLEAR_COMPLETED_ID) {
clearCompletedTasks();
return true;
} else {
return super.onMenuItemSelected(featureId, item);
}
}
private void clearCompletedTasks() {
final ProgressDialog pd = new ProgressDialog(this);
final TodorooCursor<Task> tasks = taskService.fetchFiltered(filter.sqlQuery, null, Task.ID, Task.COMPLETION_DATE);
pd.setMessage(this.getString(R.string.gtasks_GTA_clearing));
pd.show();
new Thread() {
@Override
public void run() {
String listId = null;
try {
for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) {
Task t = new Task(tasks);
if (t.isCompleted()) {
if (listId == null) {
listId = gtasksMetadataService.getTaskMetadata(t.getId()).getValue(GtasksMetadata.LIST_ID);
}
t.setValue(Task.DELETION_DATE, DateUtilities.now());
taskService.save(t);
}
}
} finally {
tasks.close();
DialogUtilities.dismissDialog(GtasksListActivity.this, pd);
}
if (listId != null) {
gtasksTaskListUpdater.correctMetadataForList(listId);
}
GtasksListActivity.this.runOnUiThread(new Runnable() {
public void run() {
loadTaskListContent(true);
}
});
}
}.start();
}
private void setCompletedForItemAndSubtasks(Task item, boolean completedState) {
final TodorooCursor<Task> tasks = taskService.fetchFiltered(filter.sqlQuery, null, Task.ID, Task.COMPLETION_DATE);
final long itemId = item.getId();
final boolean completed = completedState;
new Thread() {
@Override
public void run() {
try {
for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) {
Task curr = new Task(tasks);
if (curr.getId() == itemId) {
int itemIndent = gtasksMetadataService.getTaskMetadata(curr.getId()).getValue(GtasksMetadata.INDENT);
tasks.moveToNext();
while (!tasks.isAfterLast()) {
Task next = new Task(tasks);
int currIndent = gtasksMetadataService.getTaskMetadata(next.getId()).getValue(GtasksMetadata.INDENT);
if (currIndent > itemIndent) {
if (completed)
next.setValue(Task.COMPLETION_DATE, DateUtilities.now());
else
next.setValue(Task.COMPLETION_DATE, 0L);
taskService.save(next);
} else break;
tasks.moveToNext();
}
break;
}
}
} finally {
tasks.close();
}
GtasksListActivity.this.runOnUiThread(new Runnable() {
public void run() {
loadTaskListContent(true);
}
});
}
}.start();
}
} }

@ -160,14 +160,15 @@ public class GtasksService {
} }
} }
public com.google.api.services.tasks.v1.model.Tasks getAllGtasksFromTaskList(TaskList list, boolean includeDeleted) throws IOException { public com.google.api.services.tasks.v1.model.Tasks getAllGtasksFromTaskList(TaskList list, boolean includeDeleted, boolean includeHidden) throws IOException {
return getAllGtasksFromListId(list.id, includeDeleted); return getAllGtasksFromListId(list.id, includeDeleted, includeHidden);
} }
public com.google.api.services.tasks.v1.model.Tasks getAllGtasksFromListId(String listId, boolean includeDeleted) throws IOException { public com.google.api.services.tasks.v1.model.Tasks getAllGtasksFromListId(String listId, boolean includeDeleted, boolean includeHidden) throws IOException {
com.google.api.services.tasks.v1.model.Tasks toReturn = null; com.google.api.services.tasks.v1.model.Tasks toReturn = null;
List request = service.tasks.list(listId); List request = service.tasks.list(listId);
request.showDeleted = includeDeleted; request.showDeleted = includeDeleted;
request.showHidden = includeHidden;
try { try {
toReturn = request.execute(); toReturn = request.execute();
} catch (IOException e) { } catch (IOException e) {

@ -73,7 +73,7 @@ public class GtasksLegacyMigrator {
defaultListId = list.id; defaultListId = list.id;
} }
Tasks allTasks = gtasksService.getAllGtasksFromListId(list.id, false); Tasks allTasks = gtasksService.getAllGtasksFromListId(list.id, false, false);
if (allTasks.items != null) { if (allTasks.items != null) {
for (com.google.api.services.tasks.v1.model.Task t : allTasks.items) { for (com.google.api.services.tasks.v1.model.Task t : allTasks.items) {

@ -245,7 +245,7 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
// first, pull all tasks. then we can write them // first, pull all tasks. then we can write them
// include deleted tasks so we can delete them in astrid // include deleted tasks so we can delete them in astrid
data.remoteUpdated = readAllRemoteTasks(true); data.remoteUpdated = readAllRemoteTasks(true, true);
for(GtasksTaskContainer remote : data.remoteUpdated) { for(GtasksTaskContainer remote : data.remoteUpdated) {
if(remote.task.getId() < 1) { if(remote.task.getId() < 1) {
@ -300,7 +300,7 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
private SyncData<GtasksTaskContainer> populateSyncData() throws IOException { private SyncData<GtasksTaskContainer> populateSyncData() throws IOException {
// fetch remote tasks // fetch remote tasks
ArrayList<GtasksTaskContainer> remoteTasks = readAllRemoteTasks(false); ArrayList<GtasksTaskContainer> remoteTasks = readAllRemoteTasks(false, false);
// fetch locally created tasks // fetch locally created tasks
TodorooCursor<Task> localCreated = gtasksMetadataService.getLocallyCreated(PROPERTIES); TodorooCursor<Task> localCreated = gtasksMetadataService.getLocallyCreated(PROPERTIES);
@ -315,7 +315,7 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
// ------------------------------------------------- create / push / pull // ------------------------------------------------- create / push / pull
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
private ArrayList<GtasksTaskContainer> readAllRemoteTasks(final boolean includeDeleted) { private ArrayList<GtasksTaskContainer> readAllRemoteTasks(final boolean includeDeleted, final boolean includeHidden) {
final ArrayList<GtasksTaskContainer> list = new ArrayList<GtasksTaskContainer>(); final ArrayList<GtasksTaskContainer> list = new ArrayList<GtasksTaskContainer>();
final Semaphore listsFinished = new Semaphore(0); final Semaphore listsFinished = new Semaphore(0);
@ -329,7 +329,7 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
String listId = dashboard.getValue(GtasksList.REMOTE_ID); String listId = dashboard.getValue(GtasksList.REMOTE_ID);
if(Constants.DEBUG) if(Constants.DEBUG)
Log.e("gtasks-debug", "ACTION: getTasks, " + listId); Log.e("gtasks-debug", "ACTION: getTasks, " + listId);
List<com.google.api.services.tasks.v1.model.Task> remoteTasks = taskService.getAllGtasksFromListId(listId, includeDeleted).items; List<com.google.api.services.tasks.v1.model.Task> remoteTasks = taskService.getAllGtasksFromListId(listId, includeDeleted, includeHidden).items;
addRemoteTasksToList(remoteTasks, list); addRemoteTasksToList(remoteTasks, list);
} catch (Exception e) { } catch (Exception e) {
handleException("read-remotes", e, false); handleException("read-remotes", e, false);
@ -530,7 +530,9 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
task.setValue(Task.COMPLETION_DATE, GtasksApiUtilities.gtasksCompletedTimeToUnixTime(remoteTask.completed, 0)); task.setValue(Task.COMPLETION_DATE, GtasksApiUtilities.gtasksCompletedTimeToUnixTime(remoteTask.completed, 0));
if (remoteTask.deleted == null || !remoteTask.deleted.booleanValue()) if (remoteTask.deleted == null || !remoteTask.deleted.booleanValue())
task.setValue(Task.DELETION_DATE, 0L); task.setValue(Task.DELETION_DATE, 0L);
else if (remoteTask.deleted) else if (remoteTask.deleted.booleanValue())
task.setValue(Task.DELETION_DATE, DateUtilities.now());
if (remoteTask.hidden != null && remoteTask.hidden.booleanValue())
task.setValue(Task.DELETION_DATE, DateUtilities.now()); task.setValue(Task.DELETION_DATE, DateUtilities.now());
long dueDate = GtasksApiUtilities.gtasksDueTimeToUnixTime(remoteTask.due, 0); long dueDate = GtasksApiUtilities.gtasksDueTimeToUnixTime(remoteTask.due, 0);

@ -29,6 +29,12 @@
<string name="CFC_gtasks_list_text">In List: ?</string> <string name="CFC_gtasks_list_text">In List: ?</string>
<string name="CFC_gtasks_list_name">In GTasks List...</string> <string name="CFC_gtasks_list_name">In GTasks List...</string>
<!-- Message while clearing completed tasks -->
<string name="gtasks_GTA_clearing">Clearing completed tasks...</string>
<!-- Label for clear completed menu item -->
<string name="gtasks_GTA_clear_completed">Clear Completed</string>
<!-- ============================================ GtasksLoginActivity == --> <!-- ============================================ GtasksLoginActivity == -->
@ -70,7 +76,7 @@
<!-- Error Message when we receive a HTTP 401 Unauthorized multiple times --> <!-- Error Message when we receive a HTTP 401 Unauthorized multiple times -->
<string name="gtasks_GLA_errorAuth_captcha">You may have encountered a captcha. <string name="gtasks_GLA_errorAuth_captcha">You may have encountered a captcha.
Try logging in from the browser, then come back to try again:</string> Try logging in from the browser, then come back to try again:</string>
<!-- ============================================== GtasksPreferences == --> <!-- ============================================== GtasksPreferences == -->
<!-- GTasks Preferences Title --> <!-- GTasks Preferences Title -->

@ -152,7 +152,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener,
@Autowired ExceptionService exceptionService; @Autowired ExceptionService exceptionService;
@Autowired TaskService taskService; @Autowired protected TaskService taskService;
@Autowired MetadataService metadataService; @Autowired MetadataService metadataService;

Loading…
Cancel
Save