Alarm stuff, added upgrade logic for it, trying to fix tests

pull/14/head
Tim Su 15 years ago
parent 3e9d440ce7
commit 4287d13969

@ -1,6 +1,7 @@
package com.todoroo.andlib.service; package com.todoroo.andlib.service;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Arrays;
/** /**
* Simple Dependency Injection Service for Android. * Simple Dependency Injection Service for Android.
@ -97,8 +98,10 @@ public class DependencyInjectionService {
} }
throw new IllegalStateException( throw new IllegalStateException(
String.format("No dependency injector found for autowired field '%s' in class '%s'", String.format("No dependency injector found for autowired " +
field.getName(), caller.getClass().getName())); "field '%s' in class '%s'. Injectors: %s",
field.getName(), caller.getClass().getName(),
Arrays.asList(getInjectors())));
} }
// --- static methods // --- static methods

@ -12,7 +12,7 @@ import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.LongProperty; 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; import com.todoroo.astrid.model.Task;
/** /**
@ -38,14 +38,18 @@ public class Alarm extends AbstractModel {
public static final LongProperty TASK = new LongProperty( public static final LongProperty TASK = new LongProperty(
TABLE, "task"); TABLE, "task");
/** Associated Task */ /** Alarm Time (seconds since epoch) */
public static final IntegerProperty TIME = new IntegerProperty( public static final IntegerProperty TIME = new IntegerProperty(
TABLE, "time"); TABLE, "time");
/** Associated Task */ /** Alarm Type (see constants) */
public static final IntegerProperty TYPE = new IntegerProperty( public static final IntegerProperty TYPE = new IntegerProperty(
TABLE, "type"); TABLE, "type");
/** Alarm Ringtone */
public static final StringProperty RINGTONE = new StringProperty(
TABLE, "ringtone");
/** List of all properties for this model */ /** List of all properties for this model */
public static final Property<?>[] PROPERTIES = generateProperties(Alarm.class); public static final Property<?>[] PROPERTIES = generateProperties(Alarm.class);
@ -67,6 +71,7 @@ public class Alarm extends AbstractModel {
static { static {
defaultValues.put(TYPE.name, TYPE_SINGLE); defaultValues.put(TYPE.name, TYPE_SINGLE);
defaultValues.put(RINGTONE.name, "");
} }
@Override @Override
@ -80,12 +85,12 @@ public class Alarm extends AbstractModel {
super(); super();
} }
public Alarm(TodorooCursor<Metadata> cursor) { public Alarm(TodorooCursor<Alarm> cursor) {
this(); this();
readPropertiesFromCursor(cursor); readPropertiesFromCursor(cursor);
} }
public void readFromCursor(TodorooCursor<Metadata> cursor) { public void readFromCursor(TodorooCursor<Alarm> cursor) {
super.readPropertiesFromCursor(cursor); super.readPropertiesFromCursor(cursor);
} }

@ -2,10 +2,7 @@ package com.todoroo.astrid.alarms;
import android.content.Context; import android.content.Context;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.service.MetadataService;
/** /**
* Provides operations for working with alerts * Provides operations for working with alerts
@ -21,12 +18,6 @@ public class AlarmService {
*/ */
public static final String ALARM_COUNT = "alarms-count"; public static final String ALARM_COUNT = "alarms-count";
@Autowired
private MetadataDao metadataDao;
@Autowired
private MetadataService metadataService;
public AlarmService(@SuppressWarnings("unused") Context context) { public AlarmService(@SuppressWarnings("unused") Context context) {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
} }

@ -6,6 +6,7 @@
package com.todoroo.astrid.alarms; package com.todoroo.astrid.alarms;
import com.todoroo.andlib.data.AbstractDatabase; import com.todoroo.andlib.data.AbstractDatabase;
import com.todoroo.andlib.data.GenericDao;
import com.todoroo.andlib.data.Table; import com.todoroo.andlib.data.Table;
/** /**
@ -40,6 +41,8 @@ public class AlarmsDatabase extends AbstractDatabase {
// --- implementation // --- implementation
private GenericDao<Alarm> dao = new GenericDao<Alarm>(Alarm.class, this);
@Override @Override
protected String getName() { protected String getName() {
return NAME; return NAME;
@ -55,6 +58,10 @@ public class AlarmsDatabase extends AbstractDatabase {
return TABLES; return TABLES;
} }
public GenericDao<Alarm> getDao() {
return dao;
}
@Override @Override
protected void onCreateTables() { protected void onCreateTables() {
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
@ -65,9 +72,8 @@ public class AlarmsDatabase extends AbstractDatabase {
database.execSQL(sql.toString()); database.execSQL(sql.toString());
sql.setLength(0); 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.TABLE).append('(').
append(Alarm.TIME.name).append(',').
append(Alarm.TYPE.name). append(Alarm.TYPE.name).
append(')'); append(')');
database.execSQL(sql.toString()); database.execSQL(sql.toString());

@ -42,8 +42,8 @@ public class Alert extends AbstractModel {
// field names // field names
static final String TASK = "task"; public static final String TASK = "task";
static final String DATE = "date"; public static final String DATE = "date";
/** Default values container */ /** Default values container */
private static final ContentValues defaultValues = new ContentValues(); private static final ContentValues defaultValues = new ContentValues();

@ -76,7 +76,7 @@ public class StartupReceiver extends BroadcastReceiver {
} }
Preferences.setCurrentVersion(context, finalVersion); Preferences.setCurrentVersion(context, finalVersion);
new UpgradeService().performUpgrade(latestSetVersion, version); new UpgradeService().performUpgrade(latestSetVersion);
} }

@ -14,6 +14,7 @@ import android.webkit.WebView;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.timsu.astrid.data.AbstractController; import com.timsu.astrid.data.AbstractController;
import com.timsu.astrid.data.alerts.Alert;
import com.timsu.astrid.data.task.AbstractTaskModel; import com.timsu.astrid.data.task.AbstractTaskModel;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.GenericDao; 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.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.astrid.alarms.Alarm;
import com.todoroo.astrid.alarms.AlarmsDatabase;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
@ -50,6 +53,9 @@ public final class UpgradeService {
@Autowired @Autowired
private String tagTaskTable; private String tagTaskTable;
@Autowired
private String alertsTable;
// --- implementation // --- implementation
public UpgradeService() { public UpgradeService() {
@ -64,12 +70,12 @@ public final class UpgradeService {
* @param from * @param from
* @param to * @param to
*/ */
public void performUpgrade(int from, int to) { public void performUpgrade(int from) {
if(from >= to || from < 1) if(from < 1)
return; return;
// display changelog // display changelog
showChangeLog(from, to); showChangeLog(from);
} }
/** /**
@ -81,7 +87,7 @@ public final class UpgradeService {
* @return * @return
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
public void showChangeLog(int from, int to) { public void showChangeLog(int from) {
StringBuilder changeLog = new StringBuilder(); StringBuilder changeLog = new StringBuilder();
if(from <= 130) if(from <= 130)
@ -197,8 +203,20 @@ public final class UpgradeService {
// --- upgrade tags tables // --- upgrade tags tables
migrateTagsToMetadata(); 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 // --- database upgrade helpers
@ -236,7 +254,8 @@ public final class UpgradeService {
property == Task.HIDDEN_UNTIL || property == Task.HIDDEN_UNTIL ||
property == Task.LAST_NOTIFIED || property == Task.LAST_NOTIFIED ||
property == Task.MODIFICATION_DATE || 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); value = (int) (data.cursor.getLong(data.columnIndex) / 1000L);
else else
value = data.cursor.getInt(data.columnIndex); value = data.cursor.getInt(data.columnIndex);

@ -4,6 +4,7 @@ import android.test.AndroidTestCase;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.astrid.service.AstridDependencyInjector;
/** /**
* Base test case for Astrid tests * Base test case for Astrid tests
@ -13,6 +14,10 @@ import com.todoroo.andlib.service.DependencyInjectionService;
*/ */
public class TodorooTestCase extends AndroidTestCase { public class TodorooTestCase extends AndroidTestCase {
static {
AstridDependencyInjector.initialize();
}
public TodorooTestCase() { public TodorooTestCase() {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
} }

@ -6,6 +6,7 @@ import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.TestDependencyInjector; import com.todoroo.andlib.service.TestDependencyInjector;
import com.todoroo.andlib.test.TodorooTestCase; import com.todoroo.andlib.test.TodorooTestCase;
import com.todoroo.astrid.alarms.AlarmsDatabase;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.service.AstridDependencyInjector; import com.todoroo.astrid.service.AstridDependencyInjector;
@ -26,6 +27,8 @@ public class DatabaseTestCase extends TodorooTestCase {
@Autowired @Autowired
public Database database; public Database database;
public AlarmsDatabase alarmsDatabase;
static { static {
AstridDependencyInjector.initialize(); AstridDependencyInjector.initialize();
@ -52,6 +55,9 @@ public class DatabaseTestCase extends TodorooTestCase {
deleteDatabase(TAG_TASK_TEST); deleteDatabase(TAG_TASK_TEST);
deleteDatabase(ALERTS_TEST); deleteDatabase(ALERTS_TEST);
deleteDatabase(SYNC_TEST); deleteDatabase(SYNC_TEST);
alarmsDatabase = new AlarmsDatabase();
alarmsDatabase.clear();
database.openForWriting(); database.openForWriting();
} }
@ -68,11 +74,16 @@ public class DatabaseTestCase extends TodorooTestCase {
} }
public static class TestDatabase extends Database { public static class TestDatabase extends Database {
private static final String NAME = "databasetest"; @Override
protected String getName() {
return "databasetest";
}
}
public static class TestAlarmsDatabase extends AlarmsDatabase {
@Override @Override
protected String getName() { protected String getName() {
return NAME; return "alarmstest";
} }
} }
} }

@ -5,12 +5,15 @@ import java.util.Date;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.sql.Query; import com.todoroo.andlib.data.sql.Query;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.astrid.alarms.Alarm;
import com.todoroo.astrid.dao.TaskDao; 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.Importance;
import com.todoroo.astrid.legacy.data.enums.RepeatInterval; import com.todoroo.astrid.legacy.data.enums.RepeatInterval;
import com.todoroo.astrid.legacy.data.tag.TagController; import com.todoroo.astrid.legacy.data.tag.TagController;
import com.todoroo.astrid.legacy.data.tag.TagIdentifier; import com.todoroo.astrid.legacy.data.tag.TagIdentifier;
import com.todoroo.astrid.legacy.data.task.TaskController; 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.TaskModelForEdit;
import com.todoroo.astrid.legacy.data.task.AbstractTaskModel.RepeatInfo; import com.todoroo.astrid.legacy.data.task.AbstractTaskModel.RepeatInfo;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
@ -25,7 +28,7 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
TaskDao taskDao; TaskDao taskDao;
public void upgrade2To3() { public void upgrade2To3() {
new UpgradeService().performUpgrade(130, 150); new UpgradeService().upgrade2To3();
} }
public static void assertDatesEqual(Date old, int newDate) { public static void assertDatesEqual(Date old, int newDate) {
@ -35,6 +38,9 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
assertEquals(old.getTime() / 1000L, newDate); assertEquals(old.getTime() / 1000L, newDate);
} }
/**
* Test upgrade doesn't crash and burn when there is nothing
*/
public void testEmptyUpgrade() { public void testEmptyUpgrade() {
TaskController taskController = new TaskController(getContext()); TaskController taskController = new TaskController(getContext());
taskController.open(); taskController.open();
@ -48,6 +54,9 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
assertEquals(0, tasks.getCount()); assertEquals(0, tasks.getCount());
} }
/**
* Test various parameters of tasks table
*/
public void testTaskTableUpgrade() { public void testTaskTableUpgrade() {
TaskController taskController = new TaskController(getContext()); TaskController taskController = new TaskController(getContext());
taskController.open(); taskController.open();
@ -106,7 +115,9 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
assertDatesEqual(createdDate, task.getValue(Task.MODIFICATION_DATE)); assertDatesEqual(createdDate, task.getValue(Task.MODIFICATION_DATE));
} }
/**
* Test basic upgrading of tags
*/
public void testTagTableUpgrade() { public void testTagTableUpgrade() {
TaskController taskController = new TaskController(getContext()); TaskController taskController = new TaskController(getContext());
taskController.open(); taskController.open();
@ -139,7 +150,7 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
Tag[] tags = tagService.getGroupedTags(DataService.GROUPED_TAGS_BY_ALPHA); Tag[] tags = tagService.getGroupedTags(DataService.GROUPED_TAGS_BY_ALPHA);
assertEquals(2, tags.length); assertEquals(2, tags.length);
assertEquals("salty", tags[0].tag); assertEquals("salty", tags[0].tag);
assertEquals("tasty", tags[0].tag); assertEquals("tasty", tags[1].tag);
// verify that tags are applied correctly // verify that tags are applied correctly
TodorooCursor<Task> tasks = taskDao.query(Query.select(Task.PROPERTIES)); TodorooCursor<Task> tasks = taskDao.query(Query.select(Task.PROPERTIES));
@ -153,9 +164,95 @@ public class Astrid2To3UpgradeTests extends DatabaseTestCase {
tasks.moveToNext(); tasks.moveToNext();
task.readFromCursor(tasks); task.readFromCursor(tasks);
assertEquals("", tagService.getTagsAsString(task.getId())); 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<Task> 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<Alarm> 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));
}
} }

Loading…
Cancel
Save