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

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

@ -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

@ -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<Metadata> cursor) {
public Alarm(TodorooCursor<Alarm> cursor) {
this();
readPropertiesFromCursor(cursor);
}
public void readFromCursor(TodorooCursor<Metadata> cursor) {
public void readFromCursor(TodorooCursor<Alarm> cursor) {
super.readPropertiesFromCursor(cursor);
}

@ -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);
}

@ -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<Alarm> dao = new GenericDao<Alarm>(Alarm.class, this);
@Override
protected String getName() {
return NAME;
@ -55,6 +58,10 @@ public class AlarmsDatabase extends AbstractDatabase {
return TABLES;
}
public GenericDao<Alarm> 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());

@ -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();

@ -76,7 +76,7 @@ public class StartupReceiver extends BroadcastReceiver {
}
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.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);

@ -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);
}

@ -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";
}
}
}

@ -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<Task> 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<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