diff --git a/astrid/astrid.launch b/astrid/astrid.launch index 065607e32..0a7cd7209 100644 --- a/astrid/astrid.launch +++ b/astrid/astrid.launch @@ -14,11 +14,9 @@ - - diff --git a/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java b/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java index 046dd723f..a1e4fd4a9 100644 --- a/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java +++ b/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java @@ -19,6 +19,11 @@ import android.graphics.BitmapFactory; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; +import android.text.InputType; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnTouchListener; +import android.widget.TextView; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; @@ -59,6 +64,19 @@ public class AndroidUtilities { } } + /** Suppress virtual keyboard until user's first tap */ + public static void suppressVirtualKeyboard(final TextView editor) { + final int inputType = editor.getInputType(); + editor.setInputType(InputType.TYPE_NULL); + editor.setOnTouchListener(new OnTouchListener() { + public boolean onTouch(View v, MotionEvent event) { + editor.setInputType(inputType); + editor.setOnTouchListener(null); + return false; + } + }); + } + /** * @return true if we're connected to the internet */ diff --git a/astrid/plugin-src/com/todoroo/astrid/backup/BackupDateUtilities.java b/astrid/plugin-src/com/todoroo/astrid/backup/BackupDateUtilities.java new file mode 100644 index 000000000..1a99d2021 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/backup/BackupDateUtilities.java @@ -0,0 +1,82 @@ +/* + * ASTRID: Android's Simple Task Recording Dashboard + * + * Copyright (c) 2009 Tim Su + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.todoroo.astrid.backup; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import android.util.Log; + +public class BackupDateUtilities { + + private static final String ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ssz"; + + + + /* Format a Date into ISO 8601 Compliant format. + + */ + public static String getIso8601String(Date d) { + SimpleDateFormat sdf = new SimpleDateFormat(ISO_8601_FORMAT); + String result = ""; + if (d != null) { + result = sdf.format(d); + } + return result; + } + + /* Take an ISO 8601 string and return a Date object. + On failure, returns null. + */ + public static Date getDateFromIso8601String(String s) { + SimpleDateFormat df = new SimpleDateFormat(ISO_8601_FORMAT); + try { + return df.parse(s); + } catch (ParseException e) { + Log.e("DateUtilities", "Error parsing ISO 8601 date"); + return null; + } + } + + /* Get current date and time as a string. + Used in TasksXmlExporter + */ + public static String getDateForExport() { + DateFormat df = new SimpleDateFormat("yyMMdd-HHmm"); + return df.format(new Date()); + } + + public static boolean wasCreatedBefore(String s, int daysAgo) { + DateFormat df = new SimpleDateFormat("yyMMdd"); + Date date; + try { + date = df.parse(s); + } catch (ParseException e) { + return false; + } + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DATE, -daysAgo); + Date calDate = cal.getTime(); + return date.before(calDate); + } +} diff --git a/astrid/src-legacy/com/timsu/astrid/utilities/BackupService.java b/astrid/plugin-src/com/todoroo/astrid/backup/BackupService.java similarity index 97% rename from astrid/src-legacy/com/timsu/astrid/utilities/BackupService.java rename to astrid/plugin-src/com/todoroo/astrid/backup/BackupService.java index fa615910e..662676cfc 100644 --- a/astrid/src-legacy/com/timsu/astrid/utilities/BackupService.java +++ b/astrid/plugin-src/com/todoroo/astrid/backup/BackupService.java @@ -1,4 +1,4 @@ -package com.timsu.astrid.utilities; +package com.todoroo.astrid.backup; import java.io.File; import java.io.FileFilter; @@ -73,7 +73,7 @@ public class BackupService extends Service { exporter.exportTasks(backupDirectorySetting.getBackupDirectory()); Preferences.setBackupSummary(ctx, ctx.getString(R.string.prefs_backup_desc_success, - DateUtilities.getFormattedDate(ctx, new Date()))); + BackupDateUtilities.getFormattedDate(ctx, new Date()))); } catch (Exception e) { // unable to backup. if (e == null || e.getMessage() == null) { diff --git a/astrid/src-legacy/com/timsu/astrid/utilities/TasksXmlExporter.java b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java similarity index 96% rename from astrid/src-legacy/com/timsu/astrid/utilities/TasksXmlExporter.java rename to astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java index 9e42ff22b..248430e38 100644 --- a/astrid/src-legacy/com/timsu/astrid/utilities/TasksXmlExporter.java +++ b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java @@ -1,4 +1,4 @@ -package com.timsu.astrid.utilities; +package com.todoroo.astrid.backup; import java.io.File; import java.io.FileOutputStream; @@ -19,15 +19,15 @@ import android.util.Xml; import android.widget.Toast; import com.timsu.astrid.R; +import com.timsu.astrid.data.TaskController; +import com.timsu.astrid.data.TaskIdentifier; +import com.timsu.astrid.data.TaskModelForXml; import com.timsu.astrid.data.alerts.AlertController; import com.timsu.astrid.data.sync.SyncDataController; import com.timsu.astrid.data.sync.SyncMapping; import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagIdentifier; import com.timsu.astrid.data.tag.TagModelForView; -import com.timsu.astrid.data.task.TaskController; -import com.timsu.astrid.data.task.TaskIdentifier; -import com.timsu.astrid.data.task.TaskModelForXml; public class TasksXmlExporter { @@ -97,7 +97,7 @@ public class TasksXmlExporter { List alerts = alertController.getTaskAlerts(task); for (Date alert : alerts) { xml.startTag(null, ALERT_TAG); - xml.attribute(null, ALERT_ATTR_DATE, DateUtilities.getIso8601String(alert)); + xml.attribute(null, ALERT_ATTR_DATE, BackupDateUtilities.getIso8601String(alert)); xml.endTag(null, ALERT_TAG); } } @@ -212,7 +212,7 @@ public class TasksXmlExporter { } else { fileName = EXPORT_FILE_NAME; } - fileName = String.format(fileName, DateUtilities.getDateForExport()); + fileName = String.format(fileName, BackupDateUtilities.getDateForExport()); setOutput(astridDir.getAbsolutePath() + "/" + fileName); return true; } else { diff --git a/astrid/src-legacy/com/timsu/astrid/utilities/TasksXmlImporter.java b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java similarity index 97% rename from astrid/src-legacy/com/timsu/astrid/utilities/TasksXmlImporter.java rename to astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java index d87bf2e2f..7db179661 100644 --- a/astrid/src-legacy/com/timsu/astrid/utilities/TasksXmlImporter.java +++ b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlImporter.java @@ -1,4 +1,4 @@ -package com.timsu.astrid.utilities; +package com.todoroo.astrid.backup; import java.io.FileNotFoundException; import java.io.FileReader; @@ -18,15 +18,15 @@ import android.util.Log; import com.timsu.astrid.R; import com.timsu.astrid.data.AbstractController; +import com.timsu.astrid.data.TaskController; +import com.timsu.astrid.data.TaskIdentifier; +import com.timsu.astrid.data.TaskModelForXml; import com.timsu.astrid.data.alerts.AlertController; import com.timsu.astrid.data.sync.SyncDataController; import com.timsu.astrid.data.sync.SyncMapping; import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagIdentifier; import com.timsu.astrid.data.tag.TagModelForView; -import com.timsu.astrid.data.task.TaskController; -import com.timsu.astrid.data.task.TaskIdentifier; -import com.timsu.astrid.data.task.TaskModelForXml; public class TasksXmlImporter { public static final String TAG = "TasksXmlImporter"; @@ -170,7 +170,7 @@ public class TasksXmlImporter { private boolean parseAlert(TaskIdentifier taskId) { String alert = xpp.getAttributeValue(null, ALERT_ATTR_DATE); if (alert != null) { - Date alertDate = DateUtilities.getDateFromIso8601String(alert); + Date alertDate = BackupDateUtilities.getDateFromIso8601String(alert); if (alertDate != null) { if (! alertController.addAlert(taskId, alertDate)) { return false; @@ -214,7 +214,7 @@ public class TasksXmlImporter { Date creationDate = null; String createdString = xpp.getAttributeValue(null, TASK_CREATION_DATE); if (createdString != null) { - creationDate = DateUtilities.getDateFromIso8601String(createdString); + creationDate = BackupDateUtilities.getDateFromIso8601String(createdString); } // If the task's name and creation date match an existing task, skip it. if (creationDate != null && taskName != null) { diff --git a/astrid/src/com/todoroo/astrid/activity/LocaleEditAlerts.java b/astrid/plugin-src/com/todoroo/astrid/locale/LocaleEditAlerts.java similarity index 99% rename from astrid/src/com/todoroo/astrid/activity/LocaleEditAlerts.java rename to astrid/plugin-src/com/todoroo/astrid/locale/LocaleEditAlerts.java index ba495d1e4..b01302814 100644 --- a/astrid/src/com/todoroo/astrid/activity/LocaleEditAlerts.java +++ b/astrid/plugin-src/com/todoroo/astrid/locale/LocaleEditAlerts.java @@ -1,4 +1,4 @@ -package com.todoroo.astrid.activity; +package com.todoroo.astrid.locale; import java.util.LinkedList; diff --git a/astrid/src-legacy/com/timsu/astrid/utilities/LocaleReceiver.java b/astrid/plugin-src/com/todoroo/astrid/locale/LocaleReceiver.java similarity index 93% rename from astrid/src-legacy/com/timsu/astrid/utilities/LocaleReceiver.java rename to astrid/plugin-src/com/todoroo/astrid/locale/LocaleReceiver.java index ab958ca16..735d70e17 100644 --- a/astrid/src-legacy/com/timsu/astrid/utilities/LocaleReceiver.java +++ b/astrid/plugin-src/com/todoroo/astrid/locale/LocaleReceiver.java @@ -1,4 +1,4 @@ -package com.timsu.astrid.utilities; +package com.todoroo.astrid.locale; import java.util.HashSet; import java.util.LinkedList; @@ -10,11 +10,10 @@ import android.content.res.Resources; import android.util.Log; import com.timsu.astrid.R; +import com.timsu.astrid.data.TaskController; +import com.timsu.astrid.data.TaskIdentifier; import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagIdentifier; -import com.timsu.astrid.data.task.TaskController; -import com.timsu.astrid.data.task.TaskIdentifier; -import com.todoroo.astrid.activity.LocaleEditAlerts; /** * Receiver is activated when Locale conditions are triggered diff --git a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java index 797291d0d..8a016ca56 100644 --- a/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/repeats/RepeatControlSet.java @@ -24,14 +24,14 @@ import com.google.ical.values.RRule; import com.google.ical.values.Weekday; import com.google.ical.values.WeekdayNum; import com.timsu.astrid.R; -import com.timsu.astrid.widget.NumberPicker; -import com.timsu.astrid.widget.NumberPickerDialog; -import com.timsu.astrid.widget.NumberPickerDialog.OnNumberPickedListener; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.model.Task; +import com.todoroo.astrid.ui.NumberPicker; +import com.todoroo.astrid.ui.NumberPickerDialog; +import com.todoroo.astrid.ui.NumberPickerDialog.OnNumberPickedListener; /** * Control Set for managing repeats diff --git a/astrid/res/layout/time_picker_dialog.xml b/astrid/res/layout/time_picker_dialog.xml index e1fc5f5b2..a5b9baa0c 100644 --- a/astrid/res/layout/time_picker_dialog.xml +++ b/astrid/res/layout/time_picker_dialog.xml @@ -17,17 +17,25 @@ */ --> - + + - - - - + + + + \ No newline at end of file diff --git a/astrid/src-legacy/com/timsu/astrid/data/task/AbstractTaskModel.java b/astrid/src-legacy/com/timsu/astrid/data/task/AbstractTaskModel.java deleted file mode 100644 index e3b206038..000000000 --- a/astrid/src-legacy/com/timsu/astrid/data/task/AbstractTaskModel.java +++ /dev/null @@ -1,633 +0,0 @@ -/* - * ASTRID: Android's Simple Task Recording Dashboard - * - * Copyright (c) 2009 Tim Su - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.timsu.astrid.data.task; - -import java.util.Date; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.util.Log; - -import com.timsu.astrid.R; -import com.timsu.astrid.data.AbstractController; -import com.timsu.astrid.data.AbstractModel; -import com.timsu.astrid.data.enums.Importance; -import com.timsu.astrid.data.enums.RepeatInterval; -import com.timsu.astrid.utilities.DialogUtilities; -import com.timsu.astrid.utilities.Preferences; - - -/** Abstract model of a task. Subclasses implement the getters and setters - * they are interested in. - * - * @author timsu - * - */ -public abstract class AbstractTaskModel extends AbstractModel { - - /** Version number of this model */ - static final int VERSION = 8; - - public static final int COMPLETE_PERCENTAGE = 100; - - // field names - - public static final String NAME = "name"; - public static final String NOTES = "notes"; - public static final String PROGRESS_PERCENTAGE = "progressPercentage"; - public static final String IMPORTANCE = "importance"; - public static final String ESTIMATED_SECONDS = "estimatedSeconds"; - public static final String ELAPSED_SECONDS = "elapsedSeconds"; - public static final String TIMER_START = "timerStart"; - public static final String DEFINITE_DUE_DATE = "definiteDueDate"; - public static final String PREFERRED_DUE_DATE = "preferredDueDate"; - public static final String HIDDEN_UNTIL = "hiddenUntil"; - public static final String POSTPONE_COUNT = "postponeCount"; - public static final String NOTIFICATIONS = "notifications"; - public static final String NOTIFICATION_FLAGS = "notificationFlags"; - public static final String LAST_NOTIFIED = "lastNotified"; - public static final String REPEAT = "repeat"; - public static final String CREATION_DATE = "creationDate"; - public static final String COMPLETION_DATE = "completionDate"; - public static final String CALENDAR_URI = "calendarUri"; - public static final String FLAGS = "flags"; - - // reserved fields --- - public static final String BLOCKING_ON = "blockingOn"; - - // notification flags - public static final int NOTIFY_BEFORE_DEADLINE = 1 << 0; - public static final int NOTIFY_AT_DEADLINE = 1 << 1; - public static final int NOTIFY_AFTER_DEADLINE = 1 << 2; - public static final int NOTIFY_NONSTOP = 1 << 3; - - // other flags - public static final int FLAG_SYNC_ON_COMPLETE = 1 << 0; - - /** Number of bits to shift repeat value by */ - public static final int REPEAT_VALUE_OFFSET = 3; - - /** Default values container */ - private static final ContentValues defaultValues = new ContentValues(); - - static { - defaultValues.put(NAME, ""); - defaultValues.put(NOTES, ""); - defaultValues.put(PROGRESS_PERCENTAGE, 0); - defaultValues.put(IMPORTANCE, Importance.DEFAULT.ordinal()); - defaultValues.put(ESTIMATED_SECONDS, 0); - defaultValues.put(ELAPSED_SECONDS, 0); - defaultValues.put(TIMER_START, 0); - defaultValues.put(DEFINITE_DUE_DATE, 0); - defaultValues.put(PREFERRED_DUE_DATE, 0); - defaultValues.put(HIDDEN_UNTIL, 0); - defaultValues.put(BLOCKING_ON, 0); - defaultValues.put(POSTPONE_COUNT, 0); - defaultValues.put(NOTIFICATIONS, 0); - defaultValues.put(NOTIFICATION_FLAGS, NOTIFY_AT_DEADLINE); - defaultValues.put(LAST_NOTIFIED, 0); - defaultValues.put(REPEAT, 0); - defaultValues.put(COMPLETION_DATE, 0); - defaultValues.put(CALENDAR_URI, (String)null); - defaultValues.put(FLAGS, 0); - } - - // --- database helper - - /** Database Helper manages creating new tables and updating old ones */ - public static class TaskModelDatabaseHelper extends SQLiteOpenHelper { - String tableName; - Context context; - - public TaskModelDatabaseHelper(Context context, String databaseName, String tableName) { - super(context, databaseName, null, VERSION); - this.tableName = tableName; - this.context = context; - } - - @Override - public synchronized void onCreate(SQLiteDatabase db) { - String sql = new StringBuilder(). - append("CREATE TABLE IF NOT EXISTS ").append(tableName).append(" ("). - append(AbstractController.KEY_ROWID).append(" integer primary key autoincrement, "). - append(NAME).append(" text not null,"). - append(NOTES).append(" text not null,"). - append(PROGRESS_PERCENTAGE).append(" integer not null,"). - append(IMPORTANCE).append(" integer not null,"). - append(ESTIMATED_SECONDS).append(" integer,"). - append(ELAPSED_SECONDS).append(" integer,"). - append(TIMER_START).append(" integer,"). - append(DEFINITE_DUE_DATE).append(" integer,"). - append(PREFERRED_DUE_DATE).append(" integer,"). - append(HIDDEN_UNTIL).append(" integer,"). - append(BLOCKING_ON).append(" integer,"). - append(POSTPONE_COUNT).append(" integer,"). - append(NOTIFICATIONS).append(" integer,"). - append(NOTIFICATION_FLAGS).append(" integer,"). - append(LAST_NOTIFIED).append(" integer,"). - append(REPEAT).append(" integer,"). - append(FLAGS).append(" integer,"). - append(CREATION_DATE).append(" integer,"). - append(COMPLETION_DATE).append(" integer,"). - append(CALENDAR_URI).append(" text"). - append(");").toString(); - db.execSQL(sql); - } - - @Override - @SuppressWarnings("fallthrough") - public synchronized void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - Log.w(getClass().getSimpleName(), "Upgrading database from version " + - oldVersion + " to " + newVersion + "."); - String sql; - - // note: we execute sql statements in their own try block to be more - // graceful if an upgrade dies halfway or something - switch(oldVersion) { - case 1: - sql = new StringBuilder().append("ALTER TABLE "). - append(tableName).append(" ADD COLUMN "). - append(LAST_NOTIFIED).append(" integer").toString(); - try { - db.execSQL(sql); - } catch (Exception e) { - Log.e("astrid", "Error updating table!", e); - } - sql = new StringBuilder().append("ALTER TABLE "). - append(tableName).append(" ADD COLUMN "). - append(NOTIFICATION_FLAGS).append(" integer").toString(); - try { - db.execSQL(sql); - } catch (Exception e) { - Log.e("astrid", "Error updating table!", e); - } - - case 2: - sql = new StringBuilder().append("ALTER TABLE "). - append(tableName).append(" ADD COLUMN "). - append(REPEAT).append(" integer").toString(); - try { - db.execSQL(sql); - } catch (Exception e) { - Log.e("astrid", "Error updating table!", e); - } - - case 3: - sql = new StringBuilder().append("ALTER TABLE "). - append(tableName).append(" ADD COLUMN "). - append(CALENDAR_URI).append(" text").toString(); - try { - db.execSQL(sql); - } catch (Exception e) { - Log.e("astrid", "Error updating table!", e); - } - - case 4: - sql = new StringBuilder().append("ALTER TABLE "). - append(tableName).append(" ADD COLUMN "). - append(POSTPONE_COUNT).append(" integer").toString(); - try { - db.execSQL(sql); - } catch (Exception e) { - Log.e("astrid", "Error updating table!", e); - } - - case 5: - case 6: - // apparently some people didn't get the flags column - // from version 5 to version 6, so we try again - - sql = new StringBuilder().append("ALTER TABLE "). - append(tableName).append(" ADD COLUMN "). - append(FLAGS).append(" integer").toString(); - try { - db.execSQL(sql); - } catch (Exception e) { - Log.e("astrid", "Error updating table!", e); - } - - case 7: - // not a real change, but make sure that columns that are null - // are converted into zeros, which was my previous assumption - - for(String column : new String[] { - ESTIMATED_SECONDS, - ELAPSED_SECONDS, - TIMER_START, - DEFINITE_DUE_DATE, - PREFERRED_DUE_DATE, - HIDDEN_UNTIL, - POSTPONE_COUNT, - LAST_NOTIFIED, - REPEAT, - CREATION_DATE, - COMPLETION_DATE }) { - sql = String.format("UPDATE %s SET %s = 0 WHERE %s ISNULL", - tableName, column, column); - try { - db.execSQL(sql); - } catch (Exception e) { - Log.e("astrid", "Error updating table!", e); - } - } - - // --- break point - - break; - - default: - // we don't know how to handle it... show an error - Log.e(getClass().getSimpleName(), "Unsupported migration from " + oldVersion + " to " + newVersion); - DialogUtilities.okDialog(context, "There was a database error reading from Alerts. Data may have been corrupted.", null); - } - } - } - - // --- utility methods - - /** Gets task color. Requires definiteDueDate and importance */ - protected int getTaskColorResource(Context context) { - if(getDefiniteDueDate() != null && getDefiniteDueDate().getTime() < - System.currentTimeMillis()) { - return R.color.task_list_overdue; - } else if(Preferences.isColorize(context)) { - return getImportance().getTaskListColor(); - } else { - return R.color.task_list_normal; - } - } - - /** Checks whether task is done. Requires progressPercentage */ - protected boolean isTaskCompleted() { - return getProgressPercentage() >= COMPLETE_PERCENTAGE; - } - - /** Stops the timer & increments elapsed time. Requires timerStart and - * elapsedSeconds */ - protected void stopTimerAndUpdateElapsedTime() { - if(getTimerStart() == null) - return; - - long start = getTimerStart().getTime(); - setTimerStart(null); - long secondsElapsed = (System.currentTimeMillis() - start)/1000; - setElapsedSeconds((int) (getElapsedSeconds() + secondsElapsed)); - } - - protected void prefetchData(String[] fields) { - for(String field : fields) { - if(field.equals(NAME)) - getName(); - else if(field.equals(NOTES)) - getNotes(); - else if(field.equals(PROGRESS_PERCENTAGE)) - getProgressPercentage(); - else if(field.equals(IMPORTANCE)) - getImportance(); - else if(field.equals(ESTIMATED_SECONDS)) - getEstimatedSeconds(); - else if(field.equals(ELAPSED_SECONDS)) - getElapsedSeconds(); - else if(field.equals(TIMER_START)) - getTimerStart(); - else if(field.equals(DEFINITE_DUE_DATE)) - getDefiniteDueDate(); - else if(field.equals(PREFERRED_DUE_DATE)) - getPreferredDueDate(); - else if(field.equals(HIDDEN_UNTIL)) - getHiddenUntil(); - else if(field.equals(BLOCKING_ON)) - getBlockingOn(); - else if(field.equals(POSTPONE_COUNT)) - getPostponeCount(); - else if(field.equals(NOTIFICATIONS)) - getNotificationIntervalSeconds(); - else if(field.equals(CREATION_DATE)) - getCreationDate(); - else if(field.equals(COMPLETION_DATE)) - getCompletionDate(); - else if(field.equals(NOTIFICATION_FLAGS)) - getNotificationFlags(); - else if(field.equals(LAST_NOTIFIED)) - getLastNotificationDate(); - else if(field.equals(REPEAT)) - getRepeat(); - else if(field.equals(FLAGS)) - getFlags(); - } - } - - // --- helper classes - - public static class RepeatInfo { - private final RepeatInterval interval; - private final int value; - - public RepeatInfo(RepeatInterval repeatInterval, int value) { - this.interval = repeatInterval; - this.value = value; - } - - public Date shiftDate(Date input) { - Date newDate = (Date)input.clone(); - interval.offsetDateBy(newDate, value); - return newDate; - } - - public RepeatInterval getInterval() { - return interval; - } - - public int getValue() { - return value; - } - - public static int toSingleField(RepeatInfo repeatInfo) { - int repeat; - if(repeatInfo == null) - repeat = 0; - else - repeat = (repeatInfo.value << REPEAT_VALUE_OFFSET) + - repeatInfo.interval.ordinal(); - return repeat; - } - - public static RepeatInfo fromSingleField(int repeat) { - if(repeat == 0) - return null; - int value = repeat >> REPEAT_VALUE_OFFSET; - RepeatInterval interval = RepeatInterval.values() - [repeat - (value << REPEAT_VALUE_OFFSET)]; - - return new RepeatInfo(interval, value); - } - - } - - // --- task identifier - - private TaskIdentifier identifier = null; - - public TaskIdentifier getTaskIdentifier() { - return identifier; - } - - void setTaskIdentifier(TaskIdentifier identifier) { - this.identifier = identifier; - } - - // --- constructors and abstract methods - - AbstractTaskModel() { - super(); - } - - /** Read identifier from database */ - AbstractTaskModel(Cursor cursor) { - super(cursor); - - Integer id = retrieveInteger(AbstractController.KEY_ROWID); - setTaskIdentifier(new TaskIdentifier(id)); - } - - /** Get identifier from argument */ - AbstractTaskModel(TaskIdentifier identifier, Cursor cursor) { - super(cursor); - - setTaskIdentifier(identifier); - } - - @Override - public ContentValues getDefaultValues() { - return defaultValues; - } - - // --- getters and setters: expose them as you see fit - - protected String getName() { - return retrieveString(NAME); - } - - protected String getNotes() { - return retrieveString(NOTES); - } - - protected int getProgressPercentage() { - return retrieveInteger(PROGRESS_PERCENTAGE); - } - - protected Importance getImportance() { - Integer value = retrieveInteger(IMPORTANCE); - if(value == null) - return null; - return Importance.values()[value]; - } - - protected Integer getEstimatedSeconds() { - return retrieveInteger(ESTIMATED_SECONDS); - } - - protected Integer getElapsedSeconds() { - return retrieveInteger(ELAPSED_SECONDS); - } - - protected Date getTimerStart() { - return retrieveDate(TIMER_START); - } - - protected Date getDefiniteDueDate() { - return retrieveDate(DEFINITE_DUE_DATE); - } - - protected Date getPreferredDueDate() { - return retrieveDate(PREFERRED_DUE_DATE); - } - - protected Date getHiddenUntil() { - return retrieveDate(HIDDEN_UNTIL); - } - - protected boolean isHidden() { - if(getHiddenUntil() == null) - return false; - return getHiddenUntil().getTime() > System.currentTimeMillis(); - } - - protected Date getCreationDate() { - return retrieveDate(CREATION_DATE); - } - - protected Date getCompletionDate() { - return retrieveDate(COMPLETION_DATE); - } - - protected TaskIdentifier getBlockingOn() { - Long value = retrieveLong(BLOCKING_ON); - if(value == null) - return null; - return new TaskIdentifier(value); - } - - protected Integer getPostponeCount() { - return retrieveInteger(POSTPONE_COUNT); - } - - protected Integer getNotificationIntervalSeconds() { - return retrieveInteger(NOTIFICATIONS); - } - - protected int getNotificationFlags() { - return retrieveInteger(NOTIFICATION_FLAGS); - } - - protected Date getLastNotificationDate() { - return retrieveDate(LAST_NOTIFIED); - } - - protected RepeatInfo getRepeat() { - int repeat = retrieveInteger(REPEAT); - if(repeat == 0) - return null; - int value = repeat >> REPEAT_VALUE_OFFSET; - RepeatInterval interval = RepeatInterval.values() - [repeat - (value << REPEAT_VALUE_OFFSET)]; - - return new RepeatInfo(interval, value); - } - - protected String getCalendarUri() { - String uri = retrieveString(CALENDAR_URI); - if(uri != null && uri.length() == 0) - return null; - else - return uri; - } - - protected int getFlags() { - return retrieveInteger(FLAGS); - } - - // --- setters - - protected void setName(String name) { - putIfChangedFromDatabase(NAME, name); - } - - protected void setNotes(String notes) { - putIfChangedFromDatabase(NOTES, notes); - } - - protected void setProgressPercentage(int progressPercentage) { - putIfChangedFromDatabase(PROGRESS_PERCENTAGE, progressPercentage); - - if(getProgressPercentage() != progressPercentage && - progressPercentage == COMPLETE_PERCENTAGE) - setCompletionDate(new Date()); - } - - protected void setImportance(Importance importance) { - putIfChangedFromDatabase(IMPORTANCE, importance.ordinal()); - } - - protected void setEstimatedSeconds(Integer estimatedSeconds) { - putIfChangedFromDatabase(ESTIMATED_SECONDS, estimatedSeconds); - } - - protected void setElapsedSeconds(int elapsedSeconds) { - putIfChangedFromDatabase(ELAPSED_SECONDS, elapsedSeconds); - } - - protected void setTimerStart(Date timerStart) { - putDate(TIMER_START, timerStart); - } - - protected void setDefiniteDueDate(Date definiteDueDate) { - putDate(DEFINITE_DUE_DATE, definiteDueDate); - } - - protected void setPreferredDueDate(Date preferredDueDate) { - putDate(PREFERRED_DUE_DATE, preferredDueDate); - } - - protected void setHiddenUntil(Date hiddenUntil) { - putDate(HIDDEN_UNTIL, hiddenUntil); - } - - protected void setBlockingOn(TaskIdentifier blockingOn) { - if(blockingOn == null || blockingOn.equals(getTaskIdentifier())) - putIfChangedFromDatabase(BLOCKING_ON, (Integer)null); - else - putIfChangedFromDatabase(BLOCKING_ON, blockingOn.getId()); - } - - protected void setPostponeCount(int postponeCount) { - putIfChangedFromDatabase(POSTPONE_COUNT, postponeCount); - } - - protected void setCreationDate(Date creationDate) { - putDate(CREATION_DATE, creationDate); - } - - protected void setCompletionDate(Date completionDate) { - putDate(COMPLETION_DATE, completionDate); - } - - protected void setNotificationIntervalSeconds(Integer intervalInSeconds) { - putIfChangedFromDatabase(NOTIFICATIONS, intervalInSeconds); - } - - protected void setNotificationFlags(int flags) { - putIfChangedFromDatabase(NOTIFICATION_FLAGS, flags); - } - - protected void setLastNotificationTime(Date date) { - putDate(LAST_NOTIFIED, date); - } - - protected void setRepeat(RepeatInfo repeatInfo) { - int repeat; - if(repeatInfo == null) - repeat = 0; - else - repeat = (repeatInfo.value << REPEAT_VALUE_OFFSET) + - repeatInfo.interval.ordinal(); - putIfChangedFromDatabase(REPEAT, repeat); - } - - protected void setCalendarUri(String uri) { - putIfChangedFromDatabase(CALENDAR_URI, uri); - } - - protected void setFlags(int flags) { - putIfChangedFromDatabase(FLAGS, flags); - } - - // --- utility methods - - protected void putDate(String fieldName, Date date) { - if(date == null) - putIfChangedFromDatabase(fieldName, 0); - else - putIfChangedFromDatabase(fieldName, date.getTime()); - } -} diff --git a/astrid/src-legacy/com/timsu/astrid/provider/TasksProvider.java b/astrid/src-legacy/com/timsu/astrid/provider/TasksProvider.java index d8ca37d32..3111d980d 100644 --- a/astrid/src-legacy/com/timsu/astrid/provider/TasksProvider.java +++ b/astrid/src-legacy/com/timsu/astrid/provider/TasksProvider.java @@ -12,11 +12,11 @@ import android.database.MatrixCursor; import android.net.Uri; import android.util.Log; +import com.timsu.astrid.data.TaskController; +import com.timsu.astrid.data.TaskModelForProvider; import com.timsu.astrid.data.tag.TagController; import com.timsu.astrid.data.tag.TagIdentifier; import com.timsu.astrid.data.tag.TagModelForView; -import com.timsu.astrid.data.task.TaskController; -import com.timsu.astrid.data.task.TaskModelForProvider; import com.todoroo.astrid.service.AstridDependencyInjector; public class TasksProvider extends ContentProvider { diff --git a/astrid/src-legacy/com/timsu/astrid/utilities/DateUtilities.java b/astrid/src-legacy/com/timsu/astrid/utilities/DateUtilities.java deleted file mode 100644 index 06b1a3678..000000000 --- a/astrid/src-legacy/com/timsu/astrid/utilities/DateUtilities.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * ASTRID: Android's Simple Task Recording Dashboard - * - * Copyright (c) 2009 Tim Su - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package com.timsu.astrid.utilities; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - -import android.content.Context; -import android.content.res.Resources; -import android.util.Log; - -import com.timsu.astrid.R; - -public class DateUtilities { - - private static SimpleDateFormat format = null; - private static final String ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ssz"; - - /** Format a time into a medium length absolute format */ - public static String getFormattedDate(Context context, Date date) { - if(format == null) - format = Preferences.getDateFormat(context); - return format.format(date); - } - - /** - * Convenience method for dropping the preopsition argument. - */ - public static String getDurationString(Resources r, int timeInSeconds, - int unitsToShow) { - return getDurationString(r, timeInSeconds, unitsToShow, false); - } - - /** - * Format a time into the format: 5 days, 3 hours, 2 minutes - * - * @param r Resources to get strings from - * @param timeInSeconds - * @param unitsToShow number of units to show (i.e. if 2, then 5 hours - * 3 minutes 2 seconds is truncated to 5 hours 3 minutes) - * @param withPreposition whether there is a preceeding preposition - * @return - */ - public static String getDurationString(Resources r, int timeInSeconds, - int unitsToShow, boolean withPreposition) { - short days, hours, minutes, seconds; - short unitsDisplayed = 0; - - if(timeInSeconds == 0) - return r.getQuantityString(R.plurals.Nseconds, 0, 0); - - days = (short)(timeInSeconds / 24 / 3600); - timeInSeconds -= days*24*3600; - hours = (short)(timeInSeconds / 3600); - timeInSeconds -= hours * 3600; - minutes = (short)(timeInSeconds / 60); - timeInSeconds -= minutes * 60; - seconds = (short)timeInSeconds; - - StringBuilder result = new StringBuilder(); - if(days > 0) { - int daysPlural = withPreposition ? R.plurals.NdaysPreposition : R.plurals.Ndays; - result.append(r.getQuantityString(daysPlural, days, days)). - append(" "); - unitsDisplayed++; - } - if(unitsDisplayed < unitsToShow && hours > 0) { - result.append(r.getQuantityString(R.plurals.Nhours, hours, - hours)). - append(" "); - unitsDisplayed++; - } - if(unitsDisplayed < unitsToShow && minutes > 0) { - result.append(r.getQuantityString(R.plurals.Nminutes, minutes, - minutes)).append(" "); - unitsDisplayed++; - } - if(unitsDisplayed < unitsToShow && seconds > 0) { - result.append(r.getQuantityString(R.plurals.Nseconds, seconds, - seconds)).append(" "); - } - - return result.toString().trim(); - } - - /** - * Format a time into the format: 5 days, 3 hrs, 2 min - * - * @param r Resources to get strings from - * @param timeInSeconds - * @param unitsToShow number of units to show (i.e. if 2, then 5 hours - * 3 minutes 2 seconds is truncated to 5 hours 3 minutes) - * @return - */ - public static String getAbbreviatedDurationString(Resources r, int timeInSeconds, - int unitsToShow) { - short days, hours, minutes, seconds; - short unitsDisplayed = 0; - - if(timeInSeconds == 0) - return r.getQuantityString(R.plurals.Nseconds, 0, 0); - - days = (short)(timeInSeconds / 24 / 3600); - timeInSeconds -= days*24*3600; - hours = (short)(timeInSeconds / 3600); - timeInSeconds -= hours * 3600; - minutes = (short)(timeInSeconds / 60); - timeInSeconds -= minutes * 60; - seconds = (short)timeInSeconds; - - StringBuilder result = new StringBuilder(); - if(days > 0) { - result.append(r.getQuantityString(R.plurals.Ndays, days, days)). - append(" "); - unitsDisplayed++; - } - if(unitsDisplayed < unitsToShow && hours > 0) { - result.append(r.getQuantityString(R.plurals.NhoursShort, hours, - hours)). - append(" "); - unitsDisplayed++; - } - if(unitsDisplayed < unitsToShow && minutes > 0) { - result.append(r.getQuantityString(R.plurals.NminutesShort, minutes, - minutes)).append(" "); - unitsDisplayed++; - } - if(unitsDisplayed < unitsToShow && seconds > 0) { - result.append(r.getQuantityString(R.plurals.NsecondsShort, seconds, - seconds)).append(" "); - } - - return result.toString().trim(); - } - - /** - * Format a time into the format: 5 d, 3 h, 2 m - * - * @param r Resources to get strings from - * @param timeInSeconds - * @param unitsToShow number of units to show - * @return - */ - public static String getShortDurationString(Resources r, int timeInSeconds, - int unitsToShow) { - short days, hours, minutes, seconds; - short unitsDisplayed = 0; - - if(timeInSeconds == 0) - return "0 s"; - - days = (short)(timeInSeconds / 24 / 3600); - timeInSeconds -= days*24*3600; - hours = (short)(timeInSeconds / 3600); - timeInSeconds -= hours * 3600; - minutes = (short)(timeInSeconds / 60); - timeInSeconds -= minutes * 60; - seconds = (short)timeInSeconds; - - StringBuilder result = new StringBuilder(); - if(days > 0) { - result.append(days).append(" d "); - unitsDisplayed++; - } - if(unitsDisplayed < unitsToShow && hours > 0) { - result.append(hours).append(" h "); - unitsDisplayed++; - } - if(unitsDisplayed < unitsToShow && minutes > 0) { - result.append(minutes).append(" m "); - unitsDisplayed++; - } - if(unitsDisplayed < unitsToShow && seconds > 0) { - result.append(seconds).append(" s "); - } - - return result.toString(); - } - - /* Format a Date into ISO 8601 Compliant format. - - */ - public static String getIso8601String(Date d) { - SimpleDateFormat sdf = new SimpleDateFormat(ISO_8601_FORMAT); - String result = ""; - if (d != null) { - result = sdf.format(d); - } - return result; - } - - /* Take an ISO 8601 string and return a Date object. - On failure, returns null. - */ - public static Date getDateFromIso8601String(String s) { - SimpleDateFormat df = new SimpleDateFormat(ISO_8601_FORMAT); - try { - return df.parse(s); - } catch (ParseException e) { - Log.e("DateUtilities", "Error parsing ISO 8601 date"); - return null; - } - } - - /* Get current date and time as a string. - Used in TasksXmlExporter - */ - public static String getDateForExport() { - DateFormat df = new SimpleDateFormat("yyMMdd-HHmm"); - return df.format(new Date()); - } - - public static boolean wasCreatedBefore(String s, int daysAgo) { - DateFormat df = new SimpleDateFormat("yyMMdd"); - Date date; - try { - date = df.parse(s); - } catch (ParseException e) { - return false; - } - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.DATE, -daysAgo); - Date calDate = cal.getTime(); - return date.before(calDate); - } -} diff --git a/astrid/src-legacy/com/timsu/astrid/utilities/LegacyTasksXmlExporter.java b/astrid/src-legacy/com/timsu/astrid/utilities/LegacyTasksXmlExporter.java new file mode 100644 index 000000000..1cedf1137 --- /dev/null +++ b/astrid/src-legacy/com/timsu/astrid/utilities/LegacyTasksXmlExporter.java @@ -0,0 +1,278 @@ +package com.timsu.astrid.utilities; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; + +import org.xmlpull.v1.XmlSerializer; + +import android.content.Context; +import android.database.Cursor; +import android.os.Environment; +import android.util.Log; +import android.util.Xml; +import android.widget.Toast; + +import com.timsu.astrid.R; +import com.timsu.astrid.data.TaskController; +import com.timsu.astrid.data.TaskIdentifier; +import com.timsu.astrid.data.TaskModelForXml; +import com.timsu.astrid.data.alerts.AlertController; +import com.timsu.astrid.data.sync.SyncDataController; +import com.timsu.astrid.data.sync.SyncMapping; +import com.timsu.astrid.data.tag.TagController; +import com.timsu.astrid.data.tag.TagIdentifier; +import com.timsu.astrid.data.tag.TagModelForView; +import com.todoroo.astrid.backup.BackupDateUtilities; + +public class LegacyTasksXmlExporter { + + private TaskController taskController; + private TagController tagController; + private AlertController alertController; + private SyncDataController syncDataController; + private Context ctx; + private String output; + private final boolean isService; + private int exportCount; + private XmlSerializer xml; + private HashMap tagMap; + + public static final String ASTRID_TAG = "astrid"; + public static final String ASTRID_ATTR_VERSION = "version"; + public static final String TASK_TAG = "task"; + public static final String TAG_TAG = "tag"; + public static final String TAG_ATTR_NAME = "name"; + public static final String ALERT_TAG = "alert"; + public static final String ALERT_ATTR_DATE = "date"; + public static final String SYNC_TAG = "sync"; + public static final String SYNC_ATTR_SERVICE = "service"; + public static final String SYNC_ATTR_REMOTE_ID = "remote_id"; + public static final String XML_ENCODING = "utf-8"; + public static final String ASTRID_DIR = "/astrid"; + private static final String EXPORT_FILE_NAME = "user.%s.xml"; + private static final String BACKUP_FILE_NAME = "auto.%s.xml"; + public static final int FILENAME_DATE_BEGIN_INDEX = 5; + public static final int FILENAME_DATE_END_INDEX = 11; + + public LegacyTasksXmlExporter(boolean isService) { + this.isService = isService; + this.exportCount = 0; + } + + private void initTagMap() { + tagMap = tagController.getAllTagsAsMap(); + } + + private void serializeTags(TaskIdentifier task) + throws IOException { + LinkedList tags = tagController.getTaskTags(task); + for (TagIdentifier tag : tags) { + if(!tagMap.containsKey(tag) || tagMap.get(tag) == null) + continue; + xml.startTag(null, TAG_TAG); + xml.attribute(null, TAG_ATTR_NAME, tagMap.get(tag).toString()); + xml.endTag(null, TAG_TAG); + } + } + + private void serializeSyncMappings(TaskIdentifier task) + throws IOException { + HashSet syncMappings = syncDataController.getSyncMappings(task); + for (SyncMapping sync : syncMappings) { + xml.startTag(null, SYNC_TAG); + xml.attribute(null, SYNC_ATTR_SERVICE, + Integer.toString(sync.getSyncServiceId())); + xml.attribute(null, SYNC_ATTR_REMOTE_ID, sync.getRemoteId()); + xml.endTag(null, SYNC_TAG); + } + } + + private void serializeAlerts(TaskIdentifier task) + throws IOException { + List alerts = alertController.getTaskAlerts(task); + for (Date alert : alerts) { + xml.startTag(null, ALERT_TAG); + xml.attribute(null, ALERT_ATTR_DATE, BackupDateUtilities.getIso8601String(alert)); + xml.endTag(null, ALERT_TAG); + } + } + + private void serializeTasks() + throws IOException { + Cursor c = taskController.getBackupTaskListCursor(); + if (! c.moveToFirst()) { + return; // No tasks. + } + do { + TaskModelForXml task = new TaskModelForXml(c); + TaskIdentifier taskId = task.getTaskIdentifier(); + xml.startTag(null, TASK_TAG); + HashMap taskAttributes = task.getTaskAttributes(); + for (String key : taskAttributes.keySet()) { + String value = taskAttributes.get(key); + xml.attribute(null, key, value); + } + serializeTags(taskId); + serializeAlerts(taskId); + serializeSyncMappings(taskId); + xml.endTag(null, TASK_TAG); + this.exportCount++; + } while (c.moveToNext()); + c.close(); + } + + private void doTasksExport() throws IOException { + File xmlFile = new File(this.output); + xmlFile.createNewFile(); + FileOutputStream fos = new FileOutputStream(xmlFile); + xml = Xml.newSerializer(); + xml.setOutput(fos, XML_ENCODING); + + xml.startDocument(null, null); + xml.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); + + xml.startTag(null, ASTRID_TAG); + xml.attribute(null, ASTRID_ATTR_VERSION, + Integer.toString(Preferences.getCurrentVersion(ctx))); + + openControllers(); + initTagMap(); + serializeTasks(); + closeControllers(); + + xml.endTag(null, ASTRID_TAG); + xml.endDocument(); + xml.flush(); + fos.close(); + + if (!isService) { + displayToast(); + } + } + + private void displayToast() { + CharSequence text = String.format(ctx.getString(R.string.export_toast), + ctx.getResources().getQuantityString(R.plurals.Ntasks, exportCount, + exportCount), output); + Toast.makeText(ctx, text, Toast.LENGTH_LONG).show(); + } + + private void displayErrorToast(String error) { + Toast.makeText(ctx, error, Toast.LENGTH_LONG).show(); + } + + private void closeControllers() { + tagController.close(); + taskController.close(); + alertController.close(); + syncDataController.close(); + } + + private void openControllers() { + taskController.open(); + tagController.open(); + alertController.open(); + syncDataController.open(); + } + + public void exportTasks(File directory) { + if (isService && !Preferences.isBackupEnabled(ctx)) { + // Automatic backups are disabled. + return; + } + if (setupFile(directory)) { + Thread thread = new Thread(doBackgroundExport); + thread.start(); + } + } + + public static File getExportDirectory() { + String storageState = Environment.getExternalStorageState(); + if (storageState.equals(Environment.MEDIA_MOUNTED)) { + String path = Environment.getExternalStorageDirectory().getAbsolutePath(); + path = path + ASTRID_DIR; + return new File(path); + } + return null; + } + + private boolean setupFile(File directory) { + File astridDir = directory; + if (astridDir != null) { + // Check for /sdcard/astrid directory. If it doesn't exist, make it. + if (astridDir.exists() || astridDir.mkdir()) { + String fileName; + if (isService) { + fileName = BACKUP_FILE_NAME; + } else { + fileName = EXPORT_FILE_NAME; + } + fileName = String.format(fileName, BackupDateUtilities.getDateForExport()); + setOutput(astridDir.getAbsolutePath() + "/" + fileName); + return true; + } else { + // Unable to make the /sdcard/astrid directory. + String error = ctx.getString(R.string.error_sdcard, astridDir.getAbsolutePath()); + Log.e("TasksXmlExporter", error); + if (!isService) { + displayErrorToast(error); + } + return false; + } + } else { + // Unable to access the sdcard because it's not in the mounted state. + String error = ctx.getString(R.string.error_sdcard_general); + Log.e("TasksXmlExporter", error); + if (!isService) { + displayErrorToast(error); + } + return false; + } + } + + private void setOutput(String file) { + this.output = file; + } + + private final Runnable doBackgroundExport = new Runnable() { + public void run() { + /*Looper.prepare(); + try { + doTasksExport(); + } catch (IOException e) { + Log.e("TasksXmlExporter", "IOException in doTasksExport " + e.getMessage()); + } + Looper.loop();*/ + } + }; + + public void setTaskController(TaskController taskController) { + this.taskController = taskController; + } + + public void setTagController(TagController tagController) { + this.tagController = tagController; + } + + public void setAlertController(AlertController alertController) { + this.alertController = alertController; + } + + public void setSyncDataController(SyncDataController syncDataController) { + this.syncDataController = syncDataController; + } + + public void setContext(Context ctx) { + this.ctx = ctx; + setTaskController(new TaskController(ctx)); + setTagController(new TagController(ctx)); + setAlertController(new AlertController(ctx)); + setSyncDataController(new SyncDataController(ctx)); + } +} diff --git a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java index 7c9cef9cd..4b705db91 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java @@ -27,8 +27,8 @@ import java.util.List; import android.app.AlertDialog; import android.app.DatePickerDialog; -import android.app.TabActivity; import android.app.DatePickerDialog.OnDateSetListener; +import android.app.TabActivity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -42,6 +42,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; @@ -55,19 +56,15 @@ import android.widget.TabHost; import android.widget.TimePicker; import android.widget.Toast; import android.widget.ToggleButton; -import android.widget.AdapterView.OnItemSelectedListener; import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; -import com.timsu.astrid.data.task.TaskModelForEdit; -import com.timsu.astrid.utilities.AstridUtilities; -import com.timsu.astrid.widget.TimeDurationControlSet; -import com.timsu.astrid.widget.TimeDurationControlSet.TimeDurationType; import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; +import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.dao.Database; @@ -77,9 +74,11 @@ import com.todoroo.astrid.repeats.RepeatControlSet; import com.todoroo.astrid.service.StartupService; import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.tags.TagsControlSet; +import com.todoroo.astrid.ui.DeadlineTimePickerDialog; +import com.todoroo.astrid.ui.TimeDurationControlSet; +import com.todoroo.astrid.ui.DeadlineTimePickerDialog.OnDeadlineTimeSetListener; +import com.todoroo.astrid.ui.TimeDurationControlSet.TimeDurationType; import com.todoroo.astrid.utility.Constants; -import com.todoroo.astrid.widget.DeadlineTimePickerDialog; -import com.todoroo.astrid.widget.DeadlineTimePickerDialog.OnDeadlineTimeSetListener; /** * This activity is responsible for creating new tasks and editing existing @@ -162,7 +161,7 @@ public final class TaskEditActivity extends TabActivity { setUpUIComponents(); // disable keyboard until user requests it - AstridUtilities.suppressVirtualKeyboard(title); + AndroidUtilities.suppressVirtualKeyboard(title); } /* ====================================================================== @@ -1030,7 +1029,7 @@ public final class TaskEditActivity extends TabActivity { after.setChecked((flags & Task.NOTIFY_AFTER_DEADLINE) > 0); mode.setSelection((flags & - TaskModelForEdit.NOTIFY_NONSTOP) > 0 ? 1 : 0); + Task.NOTIFY_NONSTOP) > 0 ? 1 : 0); } public int getValue() { diff --git a/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java b/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java index 680e8246c..f0dd2a25d 100644 --- a/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java +++ b/astrid/src/com/todoroo/astrid/service/Astrid2To3UpgradeHelper.java @@ -21,11 +21,6 @@ import android.util.Log; import com.google.ical.values.Frequency; import com.google.ical.values.RRule; import com.timsu.astrid.R; -import com.timsu.astrid.data.AbstractController; -import com.timsu.astrid.data.alerts.Alert; -import com.timsu.astrid.data.enums.RepeatInterval; -import com.timsu.astrid.data.task.AbstractTaskModel; -import com.timsu.astrid.utilities.TasksXmlExporter; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.GenericDao; import com.todoroo.andlib.data.Property; @@ -37,6 +32,7 @@ import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.astrid.alarms.Alarm; import com.todoroo.astrid.alarms.AlarmDatabase; +import com.todoroo.astrid.backup.TasksXmlExporter; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.TaskDao; @@ -136,10 +132,10 @@ public class Astrid2To3UpgradeHelper { // --- upgrade tasks table HashMap> propertyMap = new HashMap>(); - propertyMap.put(AbstractController.KEY_ROWID, Task.ID); + propertyMap.put("_id", Task.ID); //$NON-NLS-1$ propertyMap.put(AbstractTaskModel.NAME, Task.TITLE); propertyMap.put(AbstractTaskModel.NOTES, Task.NOTES); - // don't update progress percentage, we don't use this anymore + // (don't update progress percentage, we don't use this anymore) propertyMap.put(AbstractTaskModel.IMPORTANCE, Task.IMPORTANCE); propertyMap.put(AbstractTaskModel.ESTIMATED_SECONDS, Task.ESTIMATED_SECONDS); propertyMap.put(AbstractTaskModel.ELAPSED_SECONDS, Task.ELAPSED_SECONDS); @@ -165,7 +161,7 @@ public class Astrid2To3UpgradeHelper { AlarmDatabase alarmsDatabase = new AlarmDatabase(); alarmsDatabase.openForWriting(); propertyMap.clear(); - propertyMap.put(AbstractController.KEY_ROWID, Alarm.ID); + propertyMap.put("_id", Alarm.ID); //$NON-NLS-1$ propertyMap.put(Alert.TASK, Alarm.TASK); propertyMap.put(Alert.DATE, Alarm.TIME); upgradeTable(context, alertsTable, propertyMap, new Alarm(), @@ -203,38 +199,6 @@ public class Astrid2To3UpgradeHelper { public StringBuilder upgradeNotes; } - /** Legacy repeatInfo class */ - private static class RepeatInfo { - public static final int REPEAT_VALUE_OFFSET = 3; - - private final RepeatInterval interval; - private final int value; - - public RepeatInfo(RepeatInterval repeatInterval, int value) { - this.interval = repeatInterval; - this.value = value; - } - - public RepeatInterval getInterval() { - return interval; - } - - public int getValue() { - return value; - } - - public static RepeatInfo fromSingleField(int repeat) { - if(repeat == 0) - return null; - int value = repeat >> REPEAT_VALUE_OFFSET; - RepeatInterval interval = RepeatInterval.values() - [repeat - (value << REPEAT_VALUE_OFFSET)]; - - return new RepeatInfo(interval, value); - } - - } - /** * Visitor that reads from a visitor container and writes to the model * @author Tim Su @@ -477,5 +441,76 @@ public class Astrid2To3UpgradeHelper { } } + // --- legacy data structures + + /** Legacy repeatInfo class */ + private static class RepeatInfo { + public static final int REPEAT_VALUE_OFFSET = 3; + private final RepeatInterval interval; + private final int value; + + public RepeatInfo(RepeatInterval repeatInterval, int value) { + this.interval = repeatInterval; + this.value = value; + } + + public RepeatInterval getInterval() { + return interval; + } + + public int getValue() { + return value; + } + + public static RepeatInfo fromSingleField(int repeat) { + if(repeat == 0) + return null; + int value = repeat >> REPEAT_VALUE_OFFSET; + RepeatInterval interval = RepeatInterval.values() + [repeat - (value << REPEAT_VALUE_OFFSET)]; + + return new RepeatInfo(interval, value); + } + + } + + /** Legacy repeat interval class */ + private enum RepeatInterval { + DAYS, + WEEKS, + MONTHS, + HOURS + } + + /** Legacy task class */ + @SuppressWarnings("nls") + private abstract class AbstractTaskModel { + + public static final String NAME = "name"; + public static final String NOTES = "notes"; + public static final String IMPORTANCE = "importance"; + public static final String ESTIMATED_SECONDS = "estimatedSeconds"; + public static final String ELAPSED_SECONDS = "elapsedSeconds"; + public static final String TIMER_START = "timerStart"; + public static final String DEFINITE_DUE_DATE = "definiteDueDate"; + public static final String PREFERRED_DUE_DATE = "preferredDueDate"; + public static final String HIDDEN_UNTIL = "hiddenUntil"; + public static final String POSTPONE_COUNT = "postponeCount"; + public static final String NOTIFICATIONS = "notifications"; + public static final String NOTIFICATION_FLAGS = "notificationFlags"; + public static final String LAST_NOTIFIED = "lastNotified"; + public static final String REPEAT = "repeat"; + public static final String CREATION_DATE = "creationDate"; + public static final String COMPLETION_DATE = "completionDate"; + public static final String CALENDAR_URI = "calendarUri"; + public static final String FLAGS = "flags"; + } + + /** Legacy alert class */ + @SuppressWarnings("nls") + private class Alert { + static final String TASK = "task"; + static final String DATE = "date"; + } } diff --git a/astrid/src/com/todoroo/astrid/service/StartupService.java b/astrid/src/com/todoroo/astrid/service/StartupService.java index 156d243a2..ae565f92b 100644 --- a/astrid/src/com/todoroo/astrid/service/StartupService.java +++ b/astrid/src/com/todoroo/astrid/service/StartupService.java @@ -14,12 +14,12 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import com.timsu.astrid.R; -import com.timsu.astrid.utilities.BackupService; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService.TodorooUncaughtExceptionHandler; +import com.todoroo.astrid.backup.BackupService; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.reminders.ReminderService; import com.todoroo.astrid.utility.Constants; diff --git a/astrid/src/com/todoroo/astrid/widget/DeadlineTimePickerDialog.java b/astrid/src/com/todoroo/astrid/ui/DeadlineTimePickerDialog.java similarity index 99% rename from astrid/src/com/todoroo/astrid/widget/DeadlineTimePickerDialog.java rename to astrid/src/com/todoroo/astrid/ui/DeadlineTimePickerDialog.java index c29abe5e0..ffe89daf9 100644 --- a/astrid/src/com/todoroo/astrid/widget/DeadlineTimePickerDialog.java +++ b/astrid/src/com/todoroo/astrid/ui/DeadlineTimePickerDialog.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.todoroo.astrid.widget; +package com.todoroo.astrid.ui; import java.util.Calendar; diff --git a/astrid/src-legacy/com/timsu/astrid/widget/FilePickerBuilder.java b/astrid/src/com/todoroo/astrid/ui/FilePickerBuilder.java similarity index 97% rename from astrid/src-legacy/com/timsu/astrid/widget/FilePickerBuilder.java rename to astrid/src/com/todoroo/astrid/ui/FilePickerBuilder.java index 9ae4bfc25..aa7759567 100644 --- a/astrid/src-legacy/com/timsu/astrid/widget/FilePickerBuilder.java +++ b/astrid/src/com/todoroo/astrid/ui/FilePickerBuilder.java @@ -1,4 +1,4 @@ -package com.timsu.astrid.widget; +package com.todoroo.astrid.ui; import java.io.File; import java.io.FilenameFilter; @@ -13,6 +13,7 @@ import android.util.Log; import com.timsu.astrid.R; +@SuppressWarnings("nls") public class FilePickerBuilder extends AlertDialog.Builder implements DialogInterface.OnClickListener { public interface OnFilePickedListener { diff --git a/astrid/src-legacy/com/timsu/astrid/widget/NNumberPickerDialog.java b/astrid/src/com/todoroo/astrid/ui/NNumberPickerDialog.java similarity index 99% rename from astrid/src-legacy/com/timsu/astrid/widget/NNumberPickerDialog.java rename to astrid/src/com/todoroo/astrid/ui/NNumberPickerDialog.java index 80ab3b28e..5c1f80cf6 100644 --- a/astrid/src-legacy/com/timsu/astrid/widget/NNumberPickerDialog.java +++ b/astrid/src/com/todoroo/astrid/ui/NNumberPickerDialog.java @@ -17,7 +17,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -package com.timsu.astrid.widget; +package com.todoroo.astrid.ui; import java.util.LinkedList; import java.util.List; diff --git a/astrid/src-legacy/com/timsu/astrid/widget/NumberPicker.java b/astrid/src/com/todoroo/astrid/ui/NumberPicker.java similarity index 98% rename from astrid/src-legacy/com/timsu/astrid/widget/NumberPicker.java rename to astrid/src/com/todoroo/astrid/ui/NumberPicker.java index 6ea6d73b0..3a5e4673b 100644 --- a/astrid/src-legacy/com/timsu/astrid/widget/NumberPicker.java +++ b/astrid/src/com/todoroo/astrid/ui/NumberPicker.java @@ -17,7 +17,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -package com.timsu.astrid.widget; +package com.todoroo.astrid.ui; import android.content.Context; import android.os.Handler; @@ -37,8 +37,9 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.timsu.astrid.R; -import com.timsu.astrid.utilities.AstridUtilities; +import com.todoroo.andlib.utility.AndroidUtilities; +@SuppressWarnings({"nls","unused"}) public class NumberPicker extends LinearLayout implements OnClickListener, OnFocusChangeListener, OnLongClickListener { @@ -139,7 +140,7 @@ public class NumberPicker extends LinearLayout implements OnClickListener, mText.setFilters(new InputFilter[] { mInputFilter }); // disable keyboard until user requests it - AstridUtilities.suppressVirtualKeyboard(mText); + AndroidUtilities.suppressVirtualKeyboard(mText); mSlideUpOutAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, @@ -347,8 +348,8 @@ public class NumberPicker extends LinearLayout implements OnClickListener, private static final char[] DIGIT_CHARACTERS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; - private NumberPickerButton mIncrementButton; - private NumberPickerButton mDecrementButton; + private final NumberPickerButton mIncrementButton; + private final NumberPickerButton mDecrementButton; class NumberPickerInputFilter implements InputFilter { public CharSequence filter(CharSequence source, int start, int end, diff --git a/astrid/src-legacy/com/timsu/astrid/widget/NumberPickerButton.java b/astrid/src/com/todoroo/astrid/ui/NumberPickerButton.java similarity index 98% rename from astrid/src-legacy/com/timsu/astrid/widget/NumberPickerButton.java rename to astrid/src/com/todoroo/astrid/ui/NumberPickerButton.java index b4a8cecfe..54c6cf9bd 100644 --- a/astrid/src-legacy/com/timsu/astrid/widget/NumberPickerButton.java +++ b/astrid/src/com/todoroo/astrid/ui/NumberPickerButton.java @@ -17,7 +17,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -package com.timsu.astrid.widget; +package com.todoroo.astrid.ui; import android.content.Context; import android.util.AttributeSet; diff --git a/astrid/src-legacy/com/timsu/astrid/widget/NumberPickerDialog.java b/astrid/src/com/todoroo/astrid/ui/NumberPickerDialog.java similarity index 98% rename from astrid/src-legacy/com/timsu/astrid/widget/NumberPickerDialog.java rename to astrid/src/com/todoroo/astrid/ui/NumberPickerDialog.java index f8fe3f3bf..0777935c9 100644 --- a/astrid/src-legacy/com/timsu/astrid/widget/NumberPickerDialog.java +++ b/astrid/src/com/todoroo/astrid/ui/NumberPickerDialog.java @@ -17,7 +17,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -package com.timsu.astrid.widget; +package com.todoroo.astrid.ui; import android.app.AlertDialog; import android.content.Context; diff --git a/astrid/src-legacy/com/timsu/astrid/widget/TimeDurationControlSet.java b/astrid/src/com/todoroo/astrid/ui/TimeDurationControlSet.java similarity index 88% rename from astrid/src-legacy/com/timsu/astrid/widget/TimeDurationControlSet.java rename to astrid/src/com/todoroo/astrid/ui/TimeDurationControlSet.java index 2af7de32c..859c5119b 100644 --- a/astrid/src-legacy/com/timsu/astrid/widget/TimeDurationControlSet.java +++ b/astrid/src/com/todoroo/astrid/ui/TimeDurationControlSet.java @@ -17,7 +17,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -package com.timsu.astrid.widget; +package com.todoroo.astrid.ui; import android.app.Activity; import android.content.res.Resources; @@ -25,12 +25,18 @@ import android.view.View; import android.widget.Button; import com.timsu.astrid.R; -import com.timsu.astrid.utilities.DateUtilities; -import com.timsu.astrid.widget.NNumberPickerDialog.OnNNumberPickedListener; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.ui.NNumberPickerDialog.OnNNumberPickedListener; +@SuppressWarnings("nls") public class TimeDurationControlSet implements OnNNumberPickedListener, View.OnClickListener { + @Autowired + DateUtilities dateUtilities; + public enum TimeDurationType { DAYS_HOURS, HOURS_MINUTES; @@ -46,6 +52,7 @@ public class TimeDurationControlSet implements OnNNumberPickedListener, public TimeDurationControlSet(Activity activity, int timeButtonId, int prefixResource, int titleResource, TimeDurationType type) { Resources r = activity.getResources(); + DependencyInjectionService.getInstance().inject(this); this.activity = activity; this.prefixResource = prefixResource; @@ -93,8 +100,8 @@ public class TimeDurationControlSet implements OnNNumberPickedListener, String prefix = ""; if(prefixResource != 0) prefix = r.getString(prefixResource); - timeButton.setText(prefix + " " + DateUtilities.getDurationString(r, - timeDurationInSeconds, 2)); + timeButton.setText(prefix + " " + dateUtilities.getDurationString( + timeDurationInSeconds * 1000L, 2)); switch(type) { case DAYS_HOURS: int days = timeDuration / 24 / 3600; diff --git a/tests/src/com/todoroo/astrid/legacy/data/task/AbstractTaskModel.java b/tests/src/com/todoroo/astrid/legacy/data/task/AbstractTaskModel.java index f2fb6035e..042260c2a 100644 --- a/tests/src/com/todoroo/astrid/legacy/data/task/AbstractTaskModel.java +++ b/tests/src/com/todoroo/astrid/legacy/data/task/AbstractTaskModel.java @@ -28,7 +28,7 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; -import com.timsu.astrid.data.task.AbstractTaskModel.RepeatInfo; +import com.timsu.astrid.data.AbstractTaskModel.RepeatInfo; import com.todoroo.astrid.legacy.data.AbstractController; import com.todoroo.astrid.legacy.data.AbstractModel; import com.todoroo.astrid.legacy.data.enums.Importance; diff --git a/tests/src/com/todoroo/astrid/legacy/data/task/TaskModelForXml.java b/tests/src/com/todoroo/astrid/legacy/data/task/TaskModelForXml.java index 0daba58d4..5b333585b 100644 --- a/tests/src/com/todoroo/astrid/legacy/data/task/TaskModelForXml.java +++ b/tests/src/com/todoroo/astrid/legacy/data/task/TaskModelForXml.java @@ -7,7 +7,7 @@ import android.database.Cursor; import android.util.Log; import com.timsu.astrid.R; -import com.timsu.astrid.utilities.DateUtilities; +import com.timsu.astrid.utilities.BackupDateUtilities; import com.todoroo.astrid.legacy.data.AbstractController; import com.todoroo.astrid.legacy.data.enums.Importance; import com.todoroo.astrid.legacy.data.enums.RepeatInterval; @@ -64,7 +64,7 @@ public class TaskModelForXml extends AbstractTaskModel { */ private void safePutDate(String field, Date value) { if (value != null) { - taskAttributesMap.put(field, DateUtilities.getIso8601String(value)); + taskAttributesMap.put(field, BackupDateUtilities.getIso8601String(value)); } } @@ -132,16 +132,16 @@ public class TaskModelForXml extends AbstractTaskModel { setElapsedSeconds(Integer.parseInt(value)); } else if(field.equals(TIMER_START)) { - setTimerStart(DateUtilities.getDateFromIso8601String(value)); + setTimerStart(BackupDateUtilities.getDateFromIso8601String(value)); } else if(field.equals(DEFINITE_DUE_DATE)) { - setDefiniteDueDate(DateUtilities.getDateFromIso8601String(value)); + setDefiniteDueDate(BackupDateUtilities.getDateFromIso8601String(value)); } else if(field.equals(PREFERRED_DUE_DATE)) { - setPreferredDueDate(DateUtilities.getDateFromIso8601String(value)); + setPreferredDueDate(BackupDateUtilities.getDateFromIso8601String(value)); } else if(field.equals(HIDDEN_UNTIL)) { - setHiddenUntil(DateUtilities.getDateFromIso8601String(value)); + setHiddenUntil(BackupDateUtilities.getDateFromIso8601String(value)); } else if(field.equals(BLOCKING_ON)) { setBlockingOn(new TaskIdentifier(Long.parseLong(value))); @@ -153,16 +153,16 @@ public class TaskModelForXml extends AbstractTaskModel { setNotificationIntervalSeconds(Integer.parseInt(value)); } else if(field.equals(CREATION_DATE)) { - setCreationDate(DateUtilities.getDateFromIso8601String(value)); + setCreationDate(BackupDateUtilities.getDateFromIso8601String(value)); } else if(field.equals(COMPLETION_DATE)) { - setCompletionDate(DateUtilities.getDateFromIso8601String(value)); + setCompletionDate(BackupDateUtilities.getDateFromIso8601String(value)); } else if(field.equals(NOTIFICATION_FLAGS)) { setNotificationFlags(Integer.parseInt(value)); } else if(field.equals(LAST_NOTIFIED)) { - setLastNotificationTime(DateUtilities.getDateFromIso8601String(value)); + setLastNotificationTime(BackupDateUtilities.getDateFromIso8601String(value)); } else if(field.equals(REPEAT_INTERVAL)) { try { diff --git a/tests/src/com/todoroo/astrid/provider/TaskProviderTests.java b/tests/src/com/todoroo/astrid/provider/TaskProviderTests.java index ca62b403c..83b1d11fe 100644 --- a/tests/src/com/todoroo/astrid/provider/TaskProviderTests.java +++ b/tests/src/com/todoroo/astrid/provider/TaskProviderTests.java @@ -5,9 +5,9 @@ import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; -import com.timsu.astrid.data.task.TaskController; -import com.timsu.astrid.data.task.TaskModelForEdit; -import com.timsu.astrid.data.task.TaskModelForList; +import com.timsu.astrid.data.TaskController; +import com.timsu.astrid.data.TaskModelForEdit; +import com.timsu.astrid.data.TaskModelForList; import com.timsu.astrid.provider.TasksProvider; import com.todoroo.astrid.test.DatabaseTestCase; diff --git a/tests/src/com/todoroo/astrid/service/BackupServiceTests.java b/tests/src/com/todoroo/astrid/service/BackupServiceTests.java index f7d22a8ec..979cdf1d2 100644 --- a/tests/src/com/todoroo/astrid/service/BackupServiceTests.java +++ b/tests/src/com/todoroo/astrid/service/BackupServiceTests.java @@ -6,10 +6,10 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; -import com.timsu.astrid.utilities.BackupService; import com.timsu.astrid.utilities.Preferences; -import com.timsu.astrid.utilities.BackupService.BackupDirectorySetting; import com.todoroo.andlib.test.TodorooTestCase; +import com.todoroo.astrid.backup.BackupService; +import com.todoroo.astrid.backup.BackupService.BackupDirectorySetting; public class BackupServiceTests extends TodorooTestCase {