From 4287d139697b91e695b5cfd267621fa3c16a7230 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Tue, 25 May 2010 18:56:37 -0700 Subject: [PATCH] Alarm stuff, added upgrade logic for it, trying to fix tests --- .../service/DependencyInjectionService.java | 7 +- .../com/todoroo/astrid/alarms/Alarm.java | 15 ++- .../todoroo/astrid/alarms/AlarmService.java | 9 -- .../todoroo/astrid/alarms/AlarmsDatabase.java | 10 +- .../com/timsu/astrid/data/alerts/Alert.java | 4 +- .../astrid/utilities/StartupReceiver.java | 2 +- .../astrid/service/UpgradeService.java | 31 +++++- .../todoroo/andlib/test/TodorooTestCase.java | 5 + .../todoroo/astrid/test/DatabaseTestCase.java | 17 ++- .../upgrade/Astrid2To3UpgradeTests.java | 103 +++++++++++++++++- 10 files changed, 170 insertions(+), 33 deletions(-) diff --git a/astrid/common-src/com/todoroo/andlib/service/DependencyInjectionService.java b/astrid/common-src/com/todoroo/andlib/service/DependencyInjectionService.java index 27b43e76f..feaa2a4c8 100644 --- a/astrid/common-src/com/todoroo/andlib/service/DependencyInjectionService.java +++ b/astrid/common-src/com/todoroo/andlib/service/DependencyInjectionService.java @@ -1,6 +1,7 @@ package com.todoroo.andlib.service; import java.lang.reflect.Field; +import java.util.Arrays; /** * Simple Dependency Injection Service for Android. @@ -97,8 +98,10 @@ public class DependencyInjectionService { } throw new IllegalStateException( - String.format("No dependency injector found for autowired field '%s' in class '%s'", - field.getName(), caller.getClass().getName())); + String.format("No dependency injector found for autowired " + + "field '%s' in class '%s'. Injectors: %s", + field.getName(), caller.getClass().getName(), + Arrays.asList(getInjectors()))); } // --- static methods diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/Alarm.java b/astrid/plugin-src/com/todoroo/astrid/alarms/Alarm.java index 7b6cd7de7..e9a39ab33 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/Alarm.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/Alarm.java @@ -12,7 +12,7 @@ import com.todoroo.andlib.data.Table; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.LongProperty; -import com.todoroo.astrid.model.Metadata; +import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.astrid.model.Task; /** @@ -38,14 +38,18 @@ public class Alarm extends AbstractModel { public static final LongProperty TASK = new LongProperty( TABLE, "task"); - /** Associated Task */ + /** Alarm Time (seconds since epoch) */ public static final IntegerProperty TIME = new IntegerProperty( TABLE, "time"); - /** Associated Task */ + /** Alarm Type (see constants) */ public static final IntegerProperty TYPE = new IntegerProperty( TABLE, "type"); + /** Alarm Ringtone */ + public static final StringProperty RINGTONE = new StringProperty( + TABLE, "ringtone"); + /** List of all properties for this model */ public static final Property[] PROPERTIES = generateProperties(Alarm.class); @@ -67,6 +71,7 @@ public class Alarm extends AbstractModel { static { defaultValues.put(TYPE.name, TYPE_SINGLE); + defaultValues.put(RINGTONE.name, ""); } @Override @@ -80,12 +85,12 @@ public class Alarm extends AbstractModel { super(); } - public Alarm(TodorooCursor cursor) { + public Alarm(TodorooCursor cursor) { this(); readPropertiesFromCursor(cursor); } - public void readFromCursor(TodorooCursor cursor) { + public void readFromCursor(TodorooCursor cursor) { super.readPropertiesFromCursor(cursor); } diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java index 94cd5fdc3..015c7ba48 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java @@ -2,10 +2,7 @@ package com.todoroo.astrid.alarms; import android.content.Context; -import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; -import com.todoroo.astrid.dao.MetadataDao; -import com.todoroo.astrid.service.MetadataService; /** * Provides operations for working with alerts @@ -21,12 +18,6 @@ public class AlarmService { */ public static final String ALARM_COUNT = "alarms-count"; - @Autowired - private MetadataDao metadataDao; - - @Autowired - private MetadataService metadataService; - public AlarmService(@SuppressWarnings("unused") Context context) { DependencyInjectionService.getInstance().inject(this); } diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmsDatabase.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmsDatabase.java index ea0306d04..667dcdb0e 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmsDatabase.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmsDatabase.java @@ -6,6 +6,7 @@ package com.todoroo.astrid.alarms; import com.todoroo.andlib.data.AbstractDatabase; +import com.todoroo.andlib.data.GenericDao; import com.todoroo.andlib.data.Table; /** @@ -40,6 +41,8 @@ public class AlarmsDatabase extends AbstractDatabase { // --- implementation + private GenericDao dao = new GenericDao(Alarm.class, this); + @Override protected String getName() { return NAME; @@ -55,6 +58,10 @@ public class AlarmsDatabase extends AbstractDatabase { return TABLES; } + public GenericDao getDao() { + return dao; + } + @Override protected void onCreateTables() { StringBuilder sql = new StringBuilder(); @@ -65,9 +72,8 @@ public class AlarmsDatabase extends AbstractDatabase { database.execSQL(sql.toString()); sql.setLength(0); - sql.append("CREATE INDEX IF NOT EXISTS a_timetype ON "). + sql.append("CREATE INDEX IF NOT EXISTS a_type ON "). append(Alarm.TABLE).append('('). - append(Alarm.TIME.name).append(','). append(Alarm.TYPE.name). append(')'); database.execSQL(sql.toString()); diff --git a/astrid/src-legacy/com/timsu/astrid/data/alerts/Alert.java b/astrid/src-legacy/com/timsu/astrid/data/alerts/Alert.java index 247eaad24..8f8f27e7b 100644 --- a/astrid/src-legacy/com/timsu/astrid/data/alerts/Alert.java +++ b/astrid/src-legacy/com/timsu/astrid/data/alerts/Alert.java @@ -42,8 +42,8 @@ public class Alert extends AbstractModel { // field names - static final String TASK = "task"; - static final String DATE = "date"; + public static final String TASK = "task"; + public static final String DATE = "date"; /** Default values container */ private static final ContentValues defaultValues = new ContentValues(); diff --git a/astrid/src-legacy/com/timsu/astrid/utilities/StartupReceiver.java b/astrid/src-legacy/com/timsu/astrid/utilities/StartupReceiver.java index a2639416d..a49ad7510 100644 --- a/astrid/src-legacy/com/timsu/astrid/utilities/StartupReceiver.java +++ b/astrid/src-legacy/com/timsu/astrid/utilities/StartupReceiver.java @@ -76,7 +76,7 @@ public class StartupReceiver extends BroadcastReceiver { } Preferences.setCurrentVersion(context, finalVersion); - new UpgradeService().performUpgrade(latestSetVersion, version); + new UpgradeService().performUpgrade(latestSetVersion); } diff --git a/astrid/src/com/todoroo/astrid/service/UpgradeService.java b/astrid/src/com/todoroo/astrid/service/UpgradeService.java index cc59fcdeb..5327a624a 100644 --- a/astrid/src/com/todoroo/astrid/service/UpgradeService.java +++ b/astrid/src/com/todoroo/astrid/service/UpgradeService.java @@ -14,6 +14,7 @@ import android.webkit.WebView; import com.timsu.astrid.R; import com.timsu.astrid.data.AbstractController; +import com.timsu.astrid.data.alerts.Alert; import com.timsu.astrid.data.task.AbstractTaskModel; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.GenericDao; @@ -22,6 +23,8 @@ import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.astrid.alarms.Alarm; +import com.todoroo.astrid.alarms.AlarmsDatabase; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.TaskDao; @@ -50,6 +53,9 @@ public final class UpgradeService { @Autowired private String tagTaskTable; + @Autowired + private String alertsTable; + // --- implementation public UpgradeService() { @@ -64,12 +70,12 @@ public final class UpgradeService { * @param from * @param to */ - public void performUpgrade(int from, int to) { - if(from >= to || from < 1) + public void performUpgrade(int from) { + if(from < 1) return; // display changelog - showChangeLog(from, to); + showChangeLog(from); } /** @@ -81,7 +87,7 @@ public final class UpgradeService { * @return */ @SuppressWarnings("nls") - public void showChangeLog(int from, int to) { + public void showChangeLog(int from) { StringBuilder changeLog = new StringBuilder(); if(from <= 130) @@ -197,8 +203,20 @@ public final class UpgradeService { // --- upgrade tags tables migrateTagsToMetadata(); - database.close(); + // --- upgrade alerts + AlarmsDatabase alarmsDatabase = new AlarmsDatabase(); + alarmsDatabase.openForWriting(); + propertyMap.clear(); + propertyMap.put(AbstractController.KEY_ROWID, Alarm.ID); + propertyMap.put(Alert.TASK, Alarm.TASK); + propertyMap.put(Alert.DATE, Alarm.TIME); + upgradeTable(context, alertsTable, propertyMap, new Alarm(), + alarmsDatabase.getDao()); + alarmsDatabase.close(); + // --- upgrade RTM sync mappings (?) + + database.close(); } // --- database upgrade helpers @@ -236,7 +254,8 @@ public final class UpgradeService { property == Task.HIDDEN_UNTIL || property == Task.LAST_NOTIFIED || property == Task.MODIFICATION_DATE || - property == Task.PREFERRED_DUE_DATE) + property == Task.PREFERRED_DUE_DATE || + property == Alarm.TIME) value = (int) (data.cursor.getLong(data.columnIndex) / 1000L); else value = data.cursor.getInt(data.columnIndex); diff --git a/tests/src/com/todoroo/andlib/test/TodorooTestCase.java b/tests/src/com/todoroo/andlib/test/TodorooTestCase.java index fc132d43a..a624f0dbd 100644 --- a/tests/src/com/todoroo/andlib/test/TodorooTestCase.java +++ b/tests/src/com/todoroo/andlib/test/TodorooTestCase.java @@ -4,6 +4,7 @@ import android.test.AndroidTestCase; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.astrid.service.AstridDependencyInjector; /** * Base test case for Astrid tests @@ -13,6 +14,10 @@ import com.todoroo.andlib.service.DependencyInjectionService; */ public class TodorooTestCase extends AndroidTestCase { + static { + AstridDependencyInjector.initialize(); + } + public TodorooTestCase() { DependencyInjectionService.getInstance().inject(this); } diff --git a/tests/src/com/todoroo/astrid/test/DatabaseTestCase.java b/tests/src/com/todoroo/astrid/test/DatabaseTestCase.java index 72e0812a1..9b6cb7495 100644 --- a/tests/src/com/todoroo/astrid/test/DatabaseTestCase.java +++ b/tests/src/com/todoroo/astrid/test/DatabaseTestCase.java @@ -6,6 +6,7 @@ import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.TestDependencyInjector; import com.todoroo.andlib.test.TodorooTestCase; +import com.todoroo.astrid.alarms.AlarmsDatabase; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.service.AstridDependencyInjector; @@ -26,6 +27,8 @@ public class DatabaseTestCase extends TodorooTestCase { @Autowired public Database database; + public AlarmsDatabase alarmsDatabase; + static { AstridDependencyInjector.initialize(); @@ -52,6 +55,9 @@ public class DatabaseTestCase extends TodorooTestCase { deleteDatabase(TAG_TASK_TEST); deleteDatabase(ALERTS_TEST); deleteDatabase(SYNC_TEST); + alarmsDatabase = new AlarmsDatabase(); + alarmsDatabase.clear(); + database.openForWriting(); } @@ -68,11 +74,16 @@ public class DatabaseTestCase extends TodorooTestCase { } public static class TestDatabase extends Database { - private static final String NAME = "databasetest"; - @Override protected String getName() { - return NAME; + return "databasetest"; + } + } + + public static class TestAlarmsDatabase extends AlarmsDatabase { + @Override + protected String getName() { + return "alarmstest"; } } } diff --git a/tests/src/com/todoroo/astrid/upgrade/Astrid2To3UpgradeTests.java b/tests/src/com/todoroo/astrid/upgrade/Astrid2To3UpgradeTests.java index d024319a5..39b0a1bc4 100644 --- a/tests/src/com/todoroo/astrid/upgrade/Astrid2To3UpgradeTests.java +++ b/tests/src/com/todoroo/astrid/upgrade/Astrid2To3UpgradeTests.java @@ -5,12 +5,15 @@ import java.util.Date; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.sql.Query; import com.todoroo.andlib.service.Autowired; +import com.todoroo.astrid.alarms.Alarm; import com.todoroo.astrid.dao.TaskDao; +import com.todoroo.astrid.legacy.data.alerts.AlertController; import com.todoroo.astrid.legacy.data.enums.Importance; import com.todoroo.astrid.legacy.data.enums.RepeatInterval; import com.todoroo.astrid.legacy.data.tag.TagController; import com.todoroo.astrid.legacy.data.tag.TagIdentifier; import com.todoroo.astrid.legacy.data.task.TaskController; +import com.todoroo.astrid.legacy.data.task.TaskIdentifier; import com.todoroo.astrid.legacy.data.task.TaskModelForEdit; import com.todoroo.astrid.legacy.data.task.AbstractTaskModel.RepeatInfo; import com.todoroo.astrid.model.Task; @@ -25,7 +28,7 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase { TaskDao taskDao; public void upgrade2To3() { - new UpgradeService().performUpgrade(130, 150); + new UpgradeService().upgrade2To3(); } public static void assertDatesEqual(Date old, int newDate) { @@ -35,6 +38,9 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase { assertEquals(old.getTime() / 1000L, newDate); } + /** + * Test upgrade doesn't crash and burn when there is nothing + */ public void testEmptyUpgrade() { TaskController taskController = new TaskController(getContext()); taskController.open(); @@ -48,6 +54,9 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase { assertEquals(0, tasks.getCount()); } + /** + * Test various parameters of tasks table + */ public void testTaskTableUpgrade() { TaskController taskController = new TaskController(getContext()); taskController.open(); @@ -106,7 +115,9 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase { assertDatesEqual(createdDate, task.getValue(Task.MODIFICATION_DATE)); } - + /** + * Test basic upgrading of tags + */ public void testTagTableUpgrade() { TaskController taskController = new TaskController(getContext()); taskController.open(); @@ -139,7 +150,7 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase { Tag[] tags = tagService.getGroupedTags(DataService.GROUPED_TAGS_BY_ALPHA); assertEquals(2, tags.length); assertEquals("salty", tags[0].tag); - assertEquals("tasty", tags[0].tag); + assertEquals("tasty", tags[1].tag); // verify that tags are applied correctly TodorooCursor tasks = taskDao.query(Query.select(Task.PROPERTIES)); @@ -153,9 +164,95 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase { tasks.moveToNext(); task.readFromCursor(tasks); assertEquals("", tagService.getTagsAsString(task.getId())); + } + + /** + * Test basic upgrading when tags point to deleted tasks + */ + public void testDanglingTagsUpgrade() { + TaskController taskController = new TaskController(getContext()); + taskController.open(); + TagController tagController = new TagController(getContext()); + tagController.open(); + + // create some ish + TagIdentifier tag1 = tagController.createTag("dangling"); + TagIdentifier tag2 = tagController.createTag("hanging"); + TagIdentifier tag3 = tagController.createTag("attached"); + + TaskModelForEdit cliff = new TaskModelForEdit(); + cliff.setName("cliff"); + taskController.saveTask(cliff, false); + TaskModelForEdit water = new TaskModelForEdit(); + water.setName("water"); + taskController.saveTask(water, false); + + // fake task identifiers + tagController.addTag(new TaskIdentifier(10), tag1); + tagController.addTag(new TaskIdentifier(15), tag2); + tagController.addTag(cliff.getTaskIdentifier(), tag3); + // assert created + assertEquals(3, tagController.getAllTags().size()); + + // upgrade + upgrade2To3(); + + // verify that data exists in our new table + database.openForReading(); + DataService tagService = new DataService(getContext()); + Tag[] tags = tagService.getGroupedTags(DataService.GROUPED_TAGS_BY_ALPHA); + assertEquals(1, tags.length); + assertEquals("attached", tags[0].tag); + + // verify that tags are applied correctly + TodorooCursor tasks = taskDao.query(Query.select(Task.PROPERTIES)); + assertEquals(2, tasks.getCount()); + tasks.moveToFirst(); + Task task = new Task(tasks); + assertEquals("attached", tagService.getTagsAsString(task.getId())); + tasks.moveToNext(); + task.readFromCursor(tasks); + assertEquals("", tagService.getTagsAsString(task.getId())); } + /** + * Test basic upgrading of alerts table + */ + public void testAlertTableUpgrade() { + TaskController taskController = new TaskController(getContext()); + taskController.open(); + AlertController alertController = new AlertController(getContext()); + alertController.open(); + + // create some ish + TaskModelForEdit christmas = new TaskModelForEdit(); + taskController.saveTask(christmas, false); + Date x1 = new Date(0,11,25); + Date x2 = new Date(1,11,25); + alertController.addAlert(christmas.getTaskIdentifier(), x1); + alertController.addAlert(christmas.getTaskIdentifier(), x2); + + // assert created + assertEquals(2, alertController.getTaskAlerts(christmas.getTaskIdentifier()).size()); + + // upgradeia32-sun-java6-bin + upgrade2To3(); + + // verify that data exists in our new table + database.openForReading(); + + alarmsDatabase.openForReading(); + TodorooCursor cursor = alarmsDatabase.getDao().query(Query.select(Alarm.TIME)); + assertEquals(2, cursor.getCount()); + cursor.moveToFirst(); + Alarm alarm = new Alarm(cursor); + assertDatesEqual(x1, alarm.getValue(Alarm.TIME)); + cursor.moveToNext(); + alarm.readFromCursor(cursor); + assertDatesEqual(x2, alarm.getValue(Alarm.TIME)); + + } }