diff --git a/astrid/res/values-de/strings.xml b/astrid/res/values-de/strings.xml
index 2cb9e86df..6afa51feb 100644
--- a/astrid/res/values-de/strings.xml
+++ b/astrid/res/values-de/strings.xml
@@ -723,6 +723,17 @@
- Am Stichtag oder überfällig
+ Erweitert
+ Alle erledigten Aufgaben löschen
+ Wollen Sie wirklich alle erledigten Aufgaben löschen?
+ Hiermit gelöschte Aufgaben können einzeln wiederhergestellt werden
+ Es wurden %d erledigte Aufgaben gelöscht!
+ Alle gelöschten Aufgaben endgültig entfernen
+ Wollen Sie wirklich alle gelöschten Aufgaben endgültig entfernen?\n
+Achtung: diese Aufgaben sind unwiederbringlich verloren, wenn Sie kein Backup gemacht haben!
+ Achtung: diese Aufgaben können nur mit der Backupfunktion wiederhergestellt werden!
+ Es wurden %d gelöschte Aufgaben endgültig entfernt!
+
diff --git a/astrid/res/values/strings-core.xml b/astrid/res/values/strings-core.xml
index cdc733696..afe002352 100644
--- a/astrid/res/values/strings-core.xml
+++ b/astrid/res/values/strings-core.xml
@@ -495,5 +495,17 @@ Astrid might not let you know when your tasks are due.\n
Astrid is the much loved open-source todo list / task manager designed to help
you get stuff done. It features reminders, tags, sync, Locale plug-in, a widget and more.
+
+
+ Extended
+ Delete completed tasks
+ Do you really want to delete all your completed tasks?
+ This deleted tasks can be undeleted individually
+ Deleted %d tasks!
+ Purge deleted tasks
+ Do you really want to purge all your deleted tasks?\n
+Attention: these tasks will be lost forever, if you did not create a recent backup!
+ Purged %d tasks!
+ Attention: these purged tasks can\'t be recovered without a backup!
diff --git a/astrid/res/xml/preferences.xml b/astrid/res/xml/preferences.xml
index e2a198300..1a87dca91 100644
--- a/astrid/res/xml/preferences.xml
+++ b/astrid/res/xml/preferences.xml
@@ -50,6 +50,15 @@
android:key="@string/p_statistics"
android:title="@string/EPr_statistics_title"
android:defaultValue="true" />
+
+
+
+
diff --git a/astrid/src/com/todoroo/astrid/activity/EditPreferences.java b/astrid/src/com/todoroo/astrid/activity/EditPreferences.java
index 98c3ee6f9..baaa322ba 100644
--- a/astrid/src/com/todoroo/astrid/activity/EditPreferences.java
+++ b/astrid/src/com/todoroo/astrid/activity/EditPreferences.java
@@ -32,6 +32,7 @@ import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.utility.AndroidUtilities;
+import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.andlib.utility.TodorooPreferenceActivity;
@@ -40,6 +41,7 @@ import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.helper.MetadataHelper;
import com.todoroo.astrid.service.AddOnService;
+import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.ui.ContactListAdapter;
@@ -61,7 +63,8 @@ public class EditPreferences extends TodorooPreferenceActivity {
// --- instance variables
- @Autowired private TaskService taskService; // for debugging
+ @Autowired private TaskService taskService;
+ @Autowired private MetadataService metadataService;
@Autowired private AddOnService addOnService;
@Autowired
@@ -102,6 +105,26 @@ public class EditPreferences extends TodorooPreferenceActivity {
}
});
+// PreferenceGroup extended = (PreferenceGroup) screen.findPreference(r.getString(R.string.EPr_extended_header));
+// extended.setOrder(screen.getPreferenceCount());
+
+ // Extended prefs
+ Preference extpreference_completed = screen.findPreference(r.getString(R.string.EPr_extended_delete_completed));
+ extpreference_completed.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ public boolean onPreferenceClick(Preference p) {
+ showDeleteCompletedDialog();
+ return true;
+ }
+ });
+
+ Preference extpreference_purged = screen.findPreference(r.getString(R.string.EPr_extended_purge_deleted));
+ extpreference_purged.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ public boolean onPreferenceClick(Preference p) {
+ showPurgeDeletedDialog();
+ return true;
+ }
+ });
+
addDebugPreferences();
addPreferenceListeners();
@@ -118,6 +141,61 @@ public class EditPreferences extends TodorooPreferenceActivity {
About.showAbout(this, version);
}
+ /** Show the dialog to delete completed tasks */
+ private void showDeleteCompletedDialog () {
+ DialogUtilities.okCancelDialog(this,
+ getResources().getString(R.string.EPr_extended_delete_completed_message),
+ new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Task template = new Task();
+ template.setValue(Task.DELETION_DATE, DateUtilities.now());
+ int result = taskService.update(Task.COMPLETION_DATE.gt(0), template);
+ DialogUtilities.okDialog(EditPreferences.this,
+ getResources().getString(R.string.EPr_extended_delete_completed_status, result),
+ new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+ }
+ },
+ new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+ }
+
+ /** Show the dialog to purge deleted tasks */
+ private void showPurgeDeletedDialog () {
+ DialogUtilities.okCancelDialog(this,
+ getResources().getString(R.string.EPr_extended_purge_deleted_message),
+ new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ int result = taskService.deleteWhere(Task.DELETION_DATE.gt(0));
+ metadataService.cleanup();
+ DialogUtilities.okDialog(EditPreferences.this,
+ getResources().getString(R.string.EPr_extended_purge_deleted_status, result),
+ new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+ }
+ },
+ new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+ }
+
private void addPluginPreferences(PreferenceScreen screen) {
Intent queryIntent = new Intent(AstridApiConstants.ACTION_SETTINGS);
PackageManager pm = getPackageManager();
diff --git a/astrid/src/com/todoroo/astrid/service/TaskService.java b/astrid/src/com/todoroo/astrid/service/TaskService.java
index 480f7df85..0470aaf1e 100644
--- a/astrid/src/com/todoroo/astrid/service/TaskService.java
+++ b/astrid/src/com/todoroo/astrid/service/TaskService.java
@@ -273,6 +273,23 @@ public class TaskService {
}
}
+ /**
+ * Update all matching a clause to have the values set on template object.
+ *
+ * Example (updates "joe" => "bob" in metadata value1):
+ * {code}
+ * Metadata item = new Metadata();
+ * item.setValue(Metadata.VALUE1, "bob");
+ * update(item, Metadata.VALUE1.eq("joe"));
+ * {code}
+ * @param where sql criteria
+ * @param template set fields on this object in order to set them in the db.
+ * @return # of updated items
+ */
+ public int update(Criterion where, Task template) {
+ return taskDao.update(where, template);
+ }
+
/**
* Count tasks overall
* @param filter
@@ -303,8 +320,8 @@ public class TaskService {
* Delete all tasks matching a given criterion
* @param all
*/
- public void deleteWhere(Criterion criteria) {
- taskDao.deleteWhere(criteria);
+ public int deleteWhere(Criterion criteria) {
+ return taskDao.deleteWhere(criteria);
}
/**