Remove MetadataService

pull/189/head
Alex Baker 12 years ago
parent de251be167
commit b0aaceb952

@ -10,6 +10,7 @@ import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.test.DatabaseTestCase; import com.todoroo.astrid.test.DatabaseTestCase;
import javax.inject.Inject; import javax.inject.Inject;
@ -19,8 +20,15 @@ public class MetadataDaoTests extends DatabaseTestCase {
@Inject MetadataDao metadataDao; @Inject MetadataDao metadataDao;
@Inject TaskDao taskDao; @Inject TaskDao taskDao;
public static Property<?>[] KEYS = new Property<?>[] { Metadata.ID, private Metadata metadata;
Metadata.KEY };
public static Property<?>[] KEYS = new Property<?>[] { Metadata.ID, Metadata.KEY };
@Override
public void setUp() {
super.setUp();
metadata = new Metadata();
}
/** /**
* Test basic creation, fetch, and save * Test basic creation, fetch, and save
@ -33,6 +41,7 @@ public class MetadataDaoTests extends DatabaseTestCase {
// create "happy" // create "happy"
Metadata metadata = new Metadata(); Metadata metadata = new Metadata();
metadata.setTask(1L);
metadata.setKey("happy"); metadata.setKey("happy");
assertTrue(metadataDao.persist(metadata)); assertTrue(metadataDao.persist(metadata));
cursor = metadataDao.query( cursor = metadataDao.query(
@ -46,6 +55,7 @@ public class MetadataDaoTests extends DatabaseTestCase {
// create "sad" // create "sad"
metadata = new Metadata(); metadata = new Metadata();
metadata.setTask(1L);
metadata.setKey("sad"); metadata.setKey("sad");
assertTrue(metadataDao.persist(metadata)); assertTrue(metadataDao.persist(metadata));
cursor = metadataDao.query(Query.select(Metadata.ID)); cursor = metadataDao.query(Query.select(Metadata.ID));
@ -123,4 +133,40 @@ public class MetadataDaoTests extends DatabaseTestCase {
assertEquals(1, cursor.getCount()); assertEquals(1, cursor.getCount());
cursor.close(); cursor.close();
} }
public void testDontSaveMetadataWithoutTaskId() {
try {
metadataDao.persist(metadata);
fail("expected exception");
} catch(IllegalArgumentException e) {
assertTrue(e.getMessage().startsWith("metadata needs to be attached to a task"));
}
}
public void testSaveMetadata() {
metadata.setTask(1L);
metadataDao.persist(metadata);
assertNotNull(metadataDao.fetch(metadata.getId()));
}
public void testDontDeleteValidMetadata() {
final Task task = new Task();
taskDao.save(task);
metadata.setTask(task.getId());
metadataDao.persist(metadata);
metadataDao.removeDanglingMetadata();
assertNotNull(metadataDao.fetch(metadata.getId()));
}
public void testDeleteDangling() {
metadata.setTask(1L);
metadataDao.persist(metadata);
metadataDao.removeDanglingMetadata();
assertNull(metadataDao.fetch(1));
}
} }

@ -7,10 +7,10 @@ package com.todoroo.astrid.gtasks;
import com.google.api.services.tasks.model.TaskList; import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists; import com.google.api.services.tasks.model.TaskLists;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase; import com.todoroo.astrid.test.DatabaseTestCase;
@ -25,7 +25,7 @@ public class GtasksIndentActionTest extends DatabaseTestCase {
@Inject GtasksMetadataService gtasksMetadataService; @Inject GtasksMetadataService gtasksMetadataService;
@Inject GtasksListService gtasksListService; @Inject GtasksListService gtasksListService;
@Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject MetadataService metadataService; @Inject MetadataDao metadataDao;
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject GtasksMetadata gtasksMetadata; @Inject GtasksMetadata gtasksMetadata;
@ -161,7 +161,7 @@ public class GtasksIndentActionTest extends DatabaseTestCase {
metadata.setValue(GtasksMetadata.ORDER, order); metadata.setValue(GtasksMetadata.ORDER, order);
metadata.setValue(GtasksMetadata.LIST_ID, "list"); metadata.setValue(GtasksMetadata.LIST_ID, "list");
metadata.setTask(newTask.getId()); metadata.setTask(newTask.getId());
metadataService.save(metadata); metadataDao.persist(metadata);
return newTask; return newTask;
} }

@ -7,9 +7,9 @@ package com.todoroo.astrid.gtasks;
import android.content.Context; import android.content.Context;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase; import com.todoroo.astrid.test.DatabaseTestCase;
@ -45,7 +45,7 @@ public class GtasksMetadataServiceTest extends DatabaseTestCase {
@Inject GtasksTestPreferenceService preferences; @Inject GtasksTestPreferenceService preferences;
@Inject GtasksMetadataService gtasksMetadataService; @Inject GtasksMetadataService gtasksMetadataService;
@Inject MetadataService metadataService; @Inject MetadataDao metadataDao;
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject GtasksMetadata gtasksMetadata; @Inject GtasksMetadata gtasksMetadata;
@ -99,7 +99,7 @@ public class GtasksMetadataServiceTest extends DatabaseTestCase {
if (id != null) if (id != null)
metadata.setValue(GtasksMetadata.ID, id); metadata.setValue(GtasksMetadata.ID, id);
metadata.setTask(task.getId()); metadata.setTask(task.getId());
metadataService.save(metadata); metadataDao.persist(metadata);
return task; return task;
} }

@ -7,10 +7,10 @@ package com.todoroo.astrid.gtasks;
import com.google.api.services.tasks.model.TaskList; import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists; import com.google.api.services.tasks.model.TaskLists;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase; import com.todoroo.astrid.test.DatabaseTestCase;
@ -27,7 +27,7 @@ public class GtasksTaskListUpdaterTest extends DatabaseTestCase {
@Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject GtasksListService gtasksListService; @Inject GtasksListService gtasksListService;
@Inject GtasksMetadataService gtasksMetadataService; @Inject GtasksMetadataService gtasksMetadataService;
@Inject MetadataService metadataService; @Inject MetadataDao metadataDao;
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject GtasksMetadata gtasksMetadata; @Inject GtasksMetadata gtasksMetadata;
@ -184,7 +184,7 @@ public class GtasksTaskListUpdaterTest extends DatabaseTestCase {
metadata.setValue(GtasksMetadata.ORDER, order); metadata.setValue(GtasksMetadata.ORDER, order);
if(indent != VALUE_UNSET) if(indent != VALUE_UNSET)
metadata.setValue(GtasksMetadata.INDENT, indent); metadata.setValue(GtasksMetadata.INDENT, indent);
metadataService.save(metadata); metadataDao.persist(metadata);
return task; return task;
} }

@ -7,10 +7,10 @@ package com.todoroo.astrid.gtasks;
import com.google.api.services.tasks.model.TaskList; import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists; import com.google.api.services.tasks.model.TaskLists;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase; import com.todoroo.astrid.test.DatabaseTestCase;
@ -27,7 +27,7 @@ public class GtasksTaskMovingTest extends DatabaseTestCase {
@Inject GtasksListService gtasksListService; @Inject GtasksListService gtasksListService;
@Inject GtasksMetadataService gtasksMetadataService; @Inject GtasksMetadataService gtasksMetadataService;
@Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject MetadataService metadataService; @Inject MetadataDao metadataDao;
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject GtasksMetadata gtasksMetadata; @Inject GtasksMetadata gtasksMetadata;
@ -287,7 +287,7 @@ public class GtasksTaskMovingTest extends DatabaseTestCase {
metadata.setValue(GtasksMetadata.ORDER, order); metadata.setValue(GtasksMetadata.ORDER, order);
if(indent != VALUE_UNSET) if(indent != VALUE_UNSET)
metadata.setValue(GtasksMetadata.INDENT, indent); metadata.setValue(GtasksMetadata.INDENT, indent);
metadataService.save(metadata); metadataDao.persist(metadata);
return task; return task;
} }

@ -1,61 +0,0 @@
package com.todoroo.astrid.service;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import org.tasks.injection.InjectingTestCase;
import javax.inject.Inject;
public class MetadataServiceTest extends InjectingTestCase {
@Inject MetadataService metadataService;
@Inject MetadataDao metadataDao;
@Inject TaskDao taskDao;
Metadata metadata;
@Override
public void setUp() {
super.setUp();
metadata = new Metadata();
}
public void testDontSaveMetadataWithoutTaskId() {
try {
metadataService.save(metadata);
fail("expected exception");
} catch(IllegalArgumentException e) {
assertTrue(e.getMessage().startsWith("metadata needs to be attached to a task"));
}
}
public void testSaveMetadata() {
metadata.setTask(1L);
metadataService.save(metadata);
assertNotNull(metadataDao.fetch(metadata.getId()));
}
public void testDontDeleteValidMetadata() {
final Task task = new Task();
taskDao.save(task);
metadata.setTask(task.getId());
metadataService.save(metadata);
metadataService.removeDanglingMetadata();
assertNotNull(metadataDao.fetch(metadata.getId()));
}
public void testDeleteDangling() {
metadata.setTask(1L);
metadataService.save(metadata);
metadataService.removeDanglingMetadata();
assertNull(metadataDao.fetch(1));
}
}

@ -13,7 +13,6 @@ import com.todoroo.astrid.model.TaskTest;
import com.todoroo.astrid.provider.Astrid3ProviderTests; import com.todoroo.astrid.provider.Astrid3ProviderTests;
import com.todoroo.astrid.reminders.ReminderServiceTest; import com.todoroo.astrid.reminders.ReminderServiceTest;
import com.todoroo.astrid.repeats.NewRepeatTests; import com.todoroo.astrid.repeats.NewRepeatTests;
import com.todoroo.astrid.service.MetadataServiceTest;
import com.todoroo.astrid.service.QuickAddMarkupTest; import com.todoroo.astrid.service.QuickAddMarkupTest;
import com.todoroo.astrid.service.TitleParserTest; import com.todoroo.astrid.service.TitleParserTest;
import com.todoroo.astrid.subtasks.SubtasksHelperTest; import com.todoroo.astrid.subtasks.SubtasksHelperTest;
@ -44,8 +43,7 @@ import dagger.Provides;
ReminderServiceTest.class, ReminderServiceTest.class,
SubtasksHelperTest.class, SubtasksHelperTest.class,
SubtasksMovingTest.class, SubtasksMovingTest.class,
SyncModelTest.class, SyncModelTest.class
MetadataServiceTest.class
}) })
public class TestModule { public class TestModule {
private Context context; private Context context;

@ -48,6 +48,7 @@ import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.actfm.ActFmCameraModule; import com.todoroo.astrid.actfm.ActFmCameraModule;
import com.todoroo.astrid.actfm.ActFmCameraModule.CameraResultCallback; import com.todoroo.astrid.actfm.ActFmCameraModule.CameraResultCallback;
import com.todoroo.astrid.alarms.AlarmService; import com.todoroo.astrid.alarms.AlarmService;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskAttachmentDao; import com.todoroo.astrid.dao.TaskAttachmentDao;
import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.RemoteModel;
@ -62,7 +63,6 @@ import com.todoroo.astrid.gcal.GCalHelper;
import com.todoroo.astrid.helper.TaskEditControlSet; import com.todoroo.astrid.helper.TaskEditControlSet;
import com.todoroo.astrid.notes.EditNoteActivity; import com.todoroo.astrid.notes.EditNoteActivity;
import com.todoroo.astrid.repeats.RepeatControlSet; import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
@ -167,7 +167,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject TaskAttachmentDao taskAttachmentDao; @Inject TaskAttachmentDao taskAttachmentDao;
@Inject TagService tagService; @Inject TagService tagService;
@Inject MetadataService metadataService; @Inject MetadataDao metadataDao;
@Inject UserActivityDao userActivityDao; @Inject UserActivityDao userActivityDao;
@Inject TaskDeleter taskDeleter; @Inject TaskDeleter taskDeleter;
@Inject NotificationManager notificationManager; @Inject NotificationManager notificationManager;
@ -276,7 +276,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
private void instantiateEditNotes() { private void instantiateEditNotes() {
if (showEditComments) { if (showEditComments) {
long idParam = getActivity().getIntent().getLongExtra(TOKEN_ID, -1L); long idParam = getActivity().getIntent().getLongExtra(TOKEN_ID, -1L);
editNotes = new EditNoteActivity(preferences, metadataService, userActivityDao, editNotes = new EditNoteActivity(preferences, metadataDao, userActivityDao,
taskService, this, getView(), idParam); taskService, this, getView(), idParam);
editNotes.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, editNotes.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT)); LayoutParams.WRAP_CONTENT));

@ -7,6 +7,7 @@ package com.todoroo.astrid.alarms;
import android.app.AlarmManager; import android.app.AlarmManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -16,21 +17,23 @@ import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.reminders.Notifications; import com.todoroo.astrid.reminders.Notifications;
import com.todoroo.astrid.reminders.ReminderService; import com.todoroo.astrid.reminders.ReminderService;
import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.SynchronizeMetadataCallback;
import com.todoroo.astrid.service.MetadataService.SynchronizeMetadataCallback;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
@ -48,12 +51,12 @@ public class AlarmService {
// --- data retrieval // --- data retrieval
private final MetadataService metadataService; private MetadataDao metadataDao;
private final Context context; private final Context context;
@Inject @Inject
public AlarmService(MetadataService metadataService, @ForApplication Context context) { public AlarmService(MetadataDao metadataDao, @ForApplication Context context) {
this.metadataService = metadataService; this.metadataDao = metadataDao;
this.context = context; this.context = context;
} }
@ -61,7 +64,7 @@ public class AlarmService {
* Return alarms for the given task. PLEASE CLOSE THE CURSOR! * Return alarms for the given task. PLEASE CLOSE THE CURSOR!
*/ */
public TodorooCursor<Metadata> getAlarms(long taskId) { public TodorooCursor<Metadata> getAlarms(long taskId) {
return metadataService.query(Query.select( return metadataDao.query(Query.select(
Metadata.PROPERTIES).where(MetadataCriteria.byTaskAndwithKey( Metadata.PROPERTIES).where(MetadataCriteria.byTaskAndwithKey(
taskId, AlarmFields.METADATA_KEY)).orderBy(Order.asc(AlarmFields.TIME))); taskId, AlarmFields.METADATA_KEY)).orderBy(Order.asc(AlarmFields.TIME)));
} }
@ -82,7 +85,7 @@ public class AlarmService {
final AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); final AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
boolean changed = metadataService.synchronizeMetadata(taskId, metadata, Metadata.KEY.eq(AlarmFields.METADATA_KEY), new SynchronizeMetadataCallback() { boolean changed = synchronizeMetadata(taskId, metadata, Metadata.KEY.eq(AlarmFields.METADATA_KEY), new SynchronizeMetadataCallback() {
@Override @Override
public void beforeDeleteMetadata(Metadata m) { public void beforeDeleteMetadata(Metadata m) {
// Cancel the alarm before the metadata is deleted // Cancel the alarm before the metadata is deleted
@ -104,7 +107,7 @@ public class AlarmService {
* @return todoroo cursor. PLEASE CLOSE THIS CURSOR! * @return todoroo cursor. PLEASE CLOSE THIS CURSOR!
*/ */
private TodorooCursor<Metadata> getActiveAlarms() { private TodorooCursor<Metadata> getActiveAlarms() {
return metadataService.query(Query.select(Metadata.ID, Metadata.TASK, AlarmFields.TIME). return metadataDao.query(Query.select(Metadata.ID, Metadata.TASK, AlarmFields.TIME).
join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))).
where(Criterion.and(TaskCriteria.isActive(), MetadataCriteria.withKey(AlarmFields.METADATA_KEY)))); where(Criterion.and(TaskCriteria.isActive(), MetadataCriteria.withKey(AlarmFields.METADATA_KEY))));
} }
@ -114,7 +117,7 @@ public class AlarmService {
* @return todoroo cursor. PLEASE CLOSE THIS CURSOR! * @return todoroo cursor. PLEASE CLOSE THIS CURSOR!
*/ */
private TodorooCursor<Metadata> getActiveAlarmsForTask(long taskId) { private TodorooCursor<Metadata> getActiveAlarmsForTask(long taskId) {
return metadataService.query(Query.select(Metadata.ID, Metadata.TASK, AlarmFields.TIME). return metadataDao.query(Query.select(Metadata.ID, Metadata.TASK, AlarmFields.TIME).
join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))).
where(Criterion.and(TaskCriteria.isActive(), where(Criterion.and(TaskCriteria.isActive(),
MetadataCriteria.byTaskAndwithKey(taskId, AlarmFields.METADATA_KEY)))); MetadataCriteria.byTaskAndwithKey(taskId, AlarmFields.METADATA_KEY))));
@ -187,4 +190,65 @@ public class AlarmService {
am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent); am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
} }
} }
private boolean synchronizeMetadata(long taskId, ArrayList<Metadata> metadata,
Criterion metadataCriterion, SynchronizeMetadataCallback callback) {
boolean dirty = false;
HashSet<ContentValues> newMetadataValues = new HashSet<>();
for(Metadata metadatum : metadata) {
metadatum.setTask(taskId);
metadatum.clearValue(Metadata.CREATION_DATE);
metadatum.clearValue(Metadata.ID);
ContentValues values = metadatum.getMergedValues();
for(Map.Entry<String, Object> entry : values.valueSet()) {
if(entry.getKey().startsWith("value")) //$NON-NLS-1$
{
values.put(entry.getKey(), entry.getValue().toString());
}
}
newMetadataValues.add(values);
}
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where(Criterion.and(MetadataCriteria.byTask(taskId),
metadataCriterion)));
try {
// try to find matches within our metadata list
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Metadata item = new Metadata(cursor);
long id = item.getId();
// clear item id when matching with incoming values
item.clearValue(Metadata.ID);
item.clearValue(Metadata.CREATION_DATE);
ContentValues itemMergedValues = item.getMergedValues();
if(newMetadataValues.contains(itemMergedValues)) {
newMetadataValues.remove(itemMergedValues);
continue;
}
// not matched. cut it
item.setId(id);
if (callback != null) {
callback.beforeDeleteMetadata(item);
}
metadataDao.delete(id);
dirty = true;
}
} finally {
cursor.close();
}
// everything that remains shall be written
for(ContentValues values : newMetadataValues) {
Metadata item = new Metadata();
item.setCreationDate(DateUtilities.now());
item.mergeWith(values);
metadataDao.persist(item);
dirty = true;
}
return dirty;
}
} }

@ -21,12 +21,12 @@ import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -60,7 +60,7 @@ public class TasksXmlExporter {
// --- implementation // --- implementation
private final TagDataDao tagDataDao; private final TagDataDao tagDataDao;
private final MetadataService metadataService; private final MetadataDao metadataDao;
private final TaskService taskService; private final TaskService taskService;
private final Preferences preferences; private final Preferences preferences;
@ -86,9 +86,9 @@ public class TasksXmlExporter {
} }
@Inject @Inject
public TasksXmlExporter(TagDataDao tagDataDao, MetadataService metadataService, TaskService taskService, Preferences preferences) { public TasksXmlExporter(TagDataDao tagDataDao, MetadataDao metadataDao, TaskService taskService, Preferences preferences) {
this.tagDataDao = tagDataDao; this.tagDataDao = tagDataDao;
this.metadataService = metadataService; this.metadataDao = metadataDao;
this.taskService = taskService; this.taskService = taskService;
this.preferences = preferences; this.preferences = preferences;
} }
@ -214,7 +214,7 @@ public class TasksXmlExporter {
} }
private synchronized void serializeMetadata(Task task) throws IOException { private synchronized void serializeMetadata(Task task) throws IOException {
TodorooCursor<Metadata> cursor = metadataService.query(Query.select( TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(
Metadata.PROPERTIES).where(MetadataCriteria.byTask(task.getId()))); Metadata.PROPERTIES).where(MetadataCriteria.byTask(task.getId())));
try { try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

@ -24,11 +24,11 @@ import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TaskToTagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
@ -49,7 +49,7 @@ public class TasksXmlImporter {
private static final Logger log = LoggerFactory.getLogger(TasksXmlImporter.class); private static final Logger log = LoggerFactory.getLogger(TasksXmlImporter.class);
private final TagDataDao tagDataDao; private final TagDataDao tagDataDao;
private final MetadataService metadataService; private final MetadataDao metadataDao;
private final TaskService taskService; private final TaskService taskService;
private Context context; private Context context;
@ -72,9 +72,9 @@ public class TasksXmlImporter {
} }
@Inject @Inject
public TasksXmlImporter(TagDataDao tagDataDao, MetadataService metadataService, TaskService taskService) { public TasksXmlImporter(TagDataDao tagDataDao, MetadataDao metadataDao, TaskService taskService) {
this.tagDataDao = tagDataDao; this.tagDataDao = tagDataDao;
this.metadataService = metadataService; this.metadataDao = metadataDao;
this.taskService = taskService; this.taskService = taskService;
} }
@ -276,7 +276,7 @@ public class TasksXmlImporter {
deserializeModel(metadata, Metadata.PROPERTIES); deserializeModel(metadata, Metadata.PROPERTIES);
metadata.setId(Metadata.NO_ID); metadata.setId(Metadata.NO_ID);
metadata.setTask(currentTask.getId()); metadata.setTask(currentTask.getId());
metadataService.save(metadata); metadataDao.persist(metadata);
// Construct the TagData from Metadata // Construct the TagData from Metadata
// Fix for failed backup, Version before 4.6.10 // Fix for failed backup, Version before 4.6.10

@ -19,9 +19,9 @@ import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gcal.GCalHelper; import com.todoroo.astrid.gcal.GCalHelper;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.utility.TodorooPreferenceActivity; import com.todoroo.astrid.utility.TodorooPreferenceActivity;
@ -41,7 +41,7 @@ public class OldTaskPreferences extends TodorooPreferenceActivity {
@Inject TaskDeleter taskDeleter; @Inject TaskDeleter taskDeleter;
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject MetadataService metadataService; @Inject MetadataDao metadataDao;
@Inject Database database; @Inject Database database;
@Inject GCalHelper gcalHelper; @Inject GCalHelper gcalHelper;
@Inject Preferences preferences; @Inject Preferences preferences;
@ -195,7 +195,7 @@ public class OldTaskPreferences extends TodorooPreferenceActivity {
cursor.close(); cursor.close();
} }
int result = taskDeleter.purgeDeletedTasks(); int result = taskDeleter.purgeDeletedTasks();
metadataService.removeDanglingMetadata(); metadataDao.removeDanglingMetadata();
showResult(R.string.EPr_manage_purge_deleted_status, result); showResult(R.string.EPr_manage_purge_deleted_status, result);
} }
}); });

@ -10,9 +10,11 @@ import android.content.ContentValues;
import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
@ -109,11 +111,22 @@ public class MetadataDao extends DatabaseDao<Metadata> {
@Override @Override
public boolean persist(Metadata item) { public boolean persist(Metadata item) {
if(!item.containsNonNullValue(Metadata.TASK)) {
throw new IllegalArgumentException("metadata needs to be attached to a task: " + item.getMergedValues()); //$NON-NLS-1$
}
if(!item.containsValue(Metadata.CREATION_DATE)) { if(!item.containsValue(Metadata.CREATION_DATE)) {
item.setCreationDate(DateUtilities.now()); item.setCreationDate(DateUtilities.now());
} }
return super.persist(item); return super.persist(item);
} }
/**
* Clean up metadata. Typically called on startup
*/
public void removeDanglingMetadata() {
deleteWhere(Metadata.ID.in(Query.select(Metadata.ID).from(Metadata.TABLE).join(Join.left(Task.TABLE,
Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull())));
}
} }

@ -18,12 +18,11 @@ import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskAttachmentDao; import com.todoroo.astrid.dao.TaskAttachmentDao;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import org.tasks.sync.SyncThrottle;
import com.todoroo.astrid.service.SyncV2Service; import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.subtasks.OrderedListFragmentHelperInterface; import com.todoroo.astrid.subtasks.OrderedListFragmentHelperInterface;
@ -34,6 +33,7 @@ import org.tasks.R;
import org.tasks.injection.ForActivity; import org.tasks.injection.ForActivity;
import org.tasks.preferences.ActivityPreferences; import org.tasks.preferences.ActivityPreferences;
import org.tasks.sync.IndeterminateProgressBarSyncResultCallback; import org.tasks.sync.IndeterminateProgressBarSyncResultCallback;
import org.tasks.sync.SyncThrottle;
import javax.inject.Inject; import javax.inject.Inject;
@ -42,7 +42,7 @@ public class GtasksListFragment extends SubtasksListFragment {
public static final String TOKEN_STORE_ID = "storeId"; //$NON-NLS-1$ public static final String TOKEN_STORE_ID = "storeId"; //$NON-NLS-1$
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject MetadataService metadataService; @Inject MetadataDao metadataDao;
@Inject StoreObjectDao storeObjectDao; @Inject StoreObjectDao storeObjectDao;
@Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject GtasksMetadataService gtasksMetadataService; @Inject GtasksMetadataService gtasksMetadataService;
@ -66,7 +66,7 @@ public class GtasksListFragment extends SubtasksListFragment {
@Override @Override
protected OrderedListFragmentHelperInterface<?> createFragmentHelper() { protected OrderedListFragmentHelperInterface<?> createFragmentHelper() {
return new OrderedMetadataListFragmentHelper<>(preferences, taskAttachmentDao, taskService, metadataService, this, gtasksTaskListUpdater); return new OrderedMetadataListFragmentHelper<>(preferences, taskAttachmentDao, taskService, metadataDao, this, gtasksTaskListUpdater);
} }
@Override @Override

@ -21,7 +21,6 @@ import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.sync.GtasksTaskContainer; import com.todoroo.astrid.gtasks.sync.GtasksTaskContainer;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater.OrderedListIterator; import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater.OrderedListIterator;
import com.todoroo.astrid.utility.SyncMetadataService; import com.todoroo.astrid.utility.SyncMetadataService;
@ -41,12 +40,9 @@ import javax.inject.Singleton;
@Singleton @Singleton
public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskContainer> { public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskContainer> {
private MetadataService metadataService;
@Inject @Inject
public GtasksMetadataService(TaskDao taskDao, MetadataDao metadataDao, MetadataService metadataService) { public GtasksMetadataService(TaskDao taskDao, MetadataDao metadataDao) {
super(taskDao, metadataDao); super(taskDao, metadataDao);
this.metadataService = metadataService;
} }
public Criterion getLocalMatchCriteria(GtasksTaskContainer remoteTask) { public Criterion getLocalMatchCriteria(GtasksTaskContainer remoteTask) {
@ -111,7 +107,7 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
GtasksMetadata.LIST_ID.eq(listId), GtasksMetadata.LIST_ID.eq(listId),
startAtCriterion)). startAtCriterion)).
orderBy(order); orderBy(order);
TodorooCursor<Metadata> cursor = metadataService.query(query); TodorooCursor<Metadata> cursor = metadataDao.query(query);
try { try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
long taskId = cursor.get(Metadata.TASK); long taskId = cursor.get(Metadata.TASK);

@ -19,7 +19,6 @@ import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater; import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -51,19 +50,16 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<StoreObjec
private final GtasksMetadataService gtasksMetadataService; private final GtasksMetadataService gtasksMetadataService;
private final GtasksSyncService gtasksSyncService; private final GtasksSyncService gtasksSyncService;
private final MetadataDao metadataDao; private final MetadataDao metadataDao;
private final MetadataService metadataService;
private final GtasksMetadata gtasksMetadata; private final GtasksMetadata gtasksMetadata;
@Inject @Inject
public GtasksTaskListUpdater(GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService, public GtasksTaskListUpdater(GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService,
GtasksSyncService gtasksSyncService, MetadataDao metadataDao, MetadataService metadataService, GtasksSyncService gtasksSyncService, MetadataDao metadataDao, GtasksMetadata gtasksMetadata) {
GtasksMetadata gtasksMetadata) { super(metadataDao);
super(metadataService);
this.gtasksListService = gtasksListService; this.gtasksListService = gtasksListService;
this.gtasksMetadataService = gtasksMetadataService; this.gtasksMetadataService = gtasksMetadataService;
this.gtasksSyncService = gtasksSyncService; this.gtasksSyncService = gtasksSyncService;
this.metadataDao = metadataDao; this.metadataDao = metadataDao;
this.metadataService = metadataService;
this.gtasksMetadata = gtasksMetadata; this.gtasksMetadata = gtasksMetadata;
} }
@ -142,7 +138,7 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<StoreObjec
} }
metadata.setValue(GtasksMetadata.PARENT_TASK, parent); metadata.setValue(GtasksMetadata.PARENT_TASK, parent);
metadataService.save(metadata); metadataDao.persist(metadata);
previousIndent.set(indent); previousIndent.set(indent);
} }
}); });

@ -25,7 +25,6 @@ import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import com.todoroo.astrid.gtasks.api.HttpNotFoundException; import com.todoroo.astrid.gtasks.api.HttpNotFoundException;
import com.todoroo.astrid.gtasks.api.MoveRequest; import com.todoroo.astrid.gtasks.api.MoveRequest;
import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator; import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -45,7 +44,6 @@ public class GtasksSyncService {
private static final String DEFAULT_LIST = "@default"; //$NON-NLS-1$ private static final String DEFAULT_LIST = "@default"; //$NON-NLS-1$
private final MetadataService metadataService;
private final MetadataDao metadataDao; private final MetadataDao metadataDao;
private final GtasksMetadataService gtasksMetadataService; private final GtasksMetadataService gtasksMetadataService;
private final TaskDao taskDao; private final TaskDao taskDao;
@ -54,11 +52,9 @@ public class GtasksSyncService {
private final GtasksMetadata gtasksMetadataFactory; private final GtasksMetadata gtasksMetadataFactory;
@Inject @Inject
public GtasksSyncService(MetadataService metadataService, MetadataDao metadataDao, public GtasksSyncService(MetadataDao metadataDao, GtasksMetadataService gtasksMetadataService,
GtasksMetadataService gtasksMetadataService, TaskDao taskDao, TaskDao taskDao, GtasksPreferenceService gtasksPreferenceService,
GtasksPreferenceService gtasksPreferenceService,
GtasksTokenValidator gtasksTokenValidator, GtasksMetadata gtasksMetadataFactory) { GtasksTokenValidator gtasksTokenValidator, GtasksMetadata gtasksMetadataFactory) {
this.metadataService = metadataService;
this.metadataDao = metadataDao; this.metadataDao = metadataDao;
this.gtasksMetadataService = gtasksMetadataService; this.gtasksMetadataService = gtasksMetadataService;
this.taskDao = taskDao; this.taskDao = taskDao;
@ -316,7 +312,7 @@ public class GtasksSyncService {
task.setModificationDate(DateUtilities.now()); task.setModificationDate(DateUtilities.now());
gtasksMetadata.setValue(GtasksMetadata.LAST_SYNC, DateUtilities.now() + 1000L); gtasksMetadata.setValue(GtasksMetadata.LAST_SYNC, DateUtilities.now() + 1000L);
metadataService.save(gtasksMetadata); metadataDao.persist(gtasksMetadata);
task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
taskDao.saveExistingWithSqlConstraintCheck(task); taskDao.saveExistingWithSqlConstraintCheck(task);
} }

@ -40,13 +40,13 @@ import com.todoroo.astrid.actfm.ActFmCameraModule.CameraResultCallback;
import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback; import com.todoroo.astrid.actfm.ActFmCameraModule.ClearImageCallback;
import com.todoroo.astrid.activity.AstridActivity; import com.todoroo.astrid.activity.AstridActivity;
import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.StartupService; import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.timers.TimerActionControlSet.TimerActionListener; import com.todoroo.astrid.timers.TimerActionControlSet.TimerActionListener;
@ -70,7 +70,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
private Task task; private Task task;
private final Preferences preferences; private final Preferences preferences;
private final MetadataService metadataService; private final MetadataDao metadataDao;
private final UserActivityDao userActivityDao; private final UserActivityDao userActivityDao;
private final TaskService taskService; private final TaskService taskService;
private final ArrayList<NoteOrUpdate> items = new ArrayList<>(); private final ArrayList<NoteOrUpdate> items = new ArrayList<>();
@ -100,7 +100,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
public EditNoteActivity( public EditNoteActivity(
Preferences preferences, Preferences preferences,
MetadataService metadataService, MetadataDao metadataDao,
UserActivityDao userActivityDao, UserActivityDao userActivityDao,
TaskService taskService, TaskService taskService,
Fragment fragment, Fragment fragment,
@ -108,7 +108,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
long t) { long t) {
super(fragment.getActivity()); super(fragment.getActivity());
this.preferences = preferences; this.preferences = preferences;
this.metadataService = metadataService; this.metadataDao = metadataDao;
this.userActivityDao = userActivityDao; this.userActivityDao = userActivityDao;
this.taskService = taskService; this.taskService = taskService;
@ -260,7 +260,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
private void setUpListAdapter() { private void setUpListAdapter() {
items.clear(); items.clear();
this.removeAllViews(); this.removeAllViews();
TodorooCursor<Metadata> notes = metadataService.query( TodorooCursor<Metadata> notes = metadataDao.query(
Query.select(Metadata.PROPERTIES).where( Query.select(Metadata.PROPERTIES).where(
MetadataCriteria.byTaskAndwithKey(task.getId(), MetadataCriteria.byTaskAndwithKey(task.getId(),
NoteMetadata.METADATA_KEY))); NoteMetadata.METADATA_KEY)));

@ -1,148 +0,0 @@
/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.service;
import android.content.ContentValues;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map.Entry;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Service layer for {@link Metadata}-centered activities.
*
* @author Tim Su <tim@todoroo.com>
*
*/
@Singleton
public class MetadataService {
public static interface SynchronizeMetadataCallback {
public void beforeDeleteMetadata(Metadata m);
}
private final MetadataDao metadataDao;
@Inject
public MetadataService(MetadataDao metadataDao) {
this.metadataDao = metadataDao;
}
// --- service layer
/**
* Clean up metadata. Typically called on startup
*/
public void removeDanglingMetadata() {
metadataDao.deleteWhere(Metadata.ID.in(Query.select(Metadata.ID).from(Metadata.TABLE).join(Join.left(Task.TABLE,
Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull())));
}
/**
* Query underlying database
*/
public TodorooCursor<Metadata> query(Query query) {
return metadataDao.query(query);
}
/**
* Delete from metadata table where rows match a certain condition
* @param where predicate for which rows to update
* @param metadata values to set
*/
public void update(Criterion where, Metadata metadata) {
metadataDao.update(where, metadata);
}
/**
* Save a single piece of metadata
*/
public void save(Metadata metadata) {
if(!metadata.containsNonNullValue(Metadata.TASK)) {
throw new IllegalArgumentException("metadata needs to be attached to a task: " + metadata.getMergedValues()); //$NON-NLS-1$
}
metadataDao.persist(metadata);
}
/**
* Synchronize metadata for given task id
* @return true if there were changes
*/
public boolean synchronizeMetadata(long taskId, ArrayList<Metadata> metadata,
Criterion metadataCriterion, SynchronizeMetadataCallback callback) {
boolean dirty = false;
HashSet<ContentValues> newMetadataValues = new HashSet<>();
for(Metadata metadatum : metadata) {
metadatum.setTask(taskId);
metadatum.clearValue(Metadata.CREATION_DATE);
metadatum.clearValue(Metadata.ID);
ContentValues values = metadatum.getMergedValues();
for(Entry<String, Object> entry : values.valueSet()) {
if(entry.getKey().startsWith("value")) //$NON-NLS-1$
{
values.put(entry.getKey(), entry.getValue().toString());
}
}
newMetadataValues.add(values);
}
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where(Criterion.and(MetadataCriteria.byTask(taskId),
metadataCriterion)));
try {
// try to find matches within our metadata list
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Metadata item = new Metadata(cursor);
long id = item.getId();
// clear item id when matching with incoming values
item.clearValue(Metadata.ID);
item.clearValue(Metadata.CREATION_DATE);
ContentValues itemMergedValues = item.getMergedValues();
if(newMetadataValues.contains(itemMergedValues)) {
newMetadataValues.remove(itemMergedValues);
continue;
}
// not matched. cut it
item.setId(id);
if (callback != null) {
callback.beforeDeleteMetadata(item);
}
metadataDao.delete(id);
dirty = true;
}
} finally {
cursor.close();
}
// everything that remains shall be written
for(ContentValues values : newMetadataValues) {
Metadata item = new Metadata();
item.setCreationDate(DateUtilities.now());
item.mergeWith(values);
metadataDao.persist(item);
dirty = true;
}
return dirty;
}
}

@ -30,6 +30,7 @@ import com.todoroo.astrid.backup.BackupConstants;
import com.todoroo.astrid.backup.BackupService; import com.todoroo.astrid.backup.BackupService;
import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.backup.TasksXmlImporter;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
@ -73,7 +74,7 @@ public class StartupService {
private final Database database; private final Database database;
private final GtasksPreferenceService gtasksPreferenceService; private final GtasksPreferenceService gtasksPreferenceService;
private final GtasksSyncService gtasksSyncService; private final GtasksSyncService gtasksSyncService;
private final MetadataService metadataService; private final MetadataDao metadataDao;
private final Preferences preferences; private final Preferences preferences;
private final TasksXmlImporter xmlImporter; private final TasksXmlImporter xmlImporter;
private final CalendarAlarmScheduler calendarAlarmScheduler; private final CalendarAlarmScheduler calendarAlarmScheduler;
@ -83,7 +84,7 @@ public class StartupService {
public StartupService(UpgradeService upgradeService, TaskService taskService, public StartupService(UpgradeService upgradeService, TaskService taskService,
TagDataDao tagDataDao, Database database, TagDataDao tagDataDao, Database database,
GtasksPreferenceService gtasksPreferenceService, GtasksPreferenceService gtasksPreferenceService,
GtasksSyncService gtasksSyncService, MetadataService metadataService, GtasksSyncService gtasksSyncService, MetadataDao metadataDao,
Preferences preferences, TasksXmlImporter xmlImporter, Preferences preferences, TasksXmlImporter xmlImporter,
CalendarAlarmScheduler calendarAlarmScheduler, TaskDeleter taskDeleter) { CalendarAlarmScheduler calendarAlarmScheduler, TaskDeleter taskDeleter) {
this.upgradeService = upgradeService; this.upgradeService = upgradeService;
@ -92,7 +93,7 @@ public class StartupService {
this.database = database; this.database = database;
this.gtasksPreferenceService = gtasksPreferenceService; this.gtasksPreferenceService = gtasksPreferenceService;
this.gtasksSyncService = gtasksSyncService; this.gtasksSyncService = gtasksSyncService;
this.metadataService = metadataService; this.metadataDao = metadataDao;
this.preferences = preferences; this.preferences = preferences;
this.xmlImporter = xmlImporter; this.xmlImporter = xmlImporter;
this.calendarAlarmScheduler = calendarAlarmScheduler; this.calendarAlarmScheduler = calendarAlarmScheduler;
@ -216,7 +217,7 @@ public class StartupService {
if (values != null) { if (values != null) {
if (values.containsKey(TagData.NAME.name)) { if (values.containsKey(TagData.NAME.name)) {
m.setValue(TaskToTagMetadata.TAG_NAME, model.getName()); m.setValue(TaskToTagMetadata.TAG_NAME, model.getName());
metadataService.update(Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY), metadataDao.update(Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY),
TaskToTagMetadata.TAG_UUID.eq(model.getUUID())), m); TaskToTagMetadata.TAG_UUID.eq(model.getUUID())), m);
} }
} }

@ -0,0 +1,7 @@
package com.todoroo.astrid.service;
import com.todoroo.astrid.data.Metadata;
public interface SynchronizeMetadataCallback {
public void beforeDeleteMetadata(Metadata m);
}

@ -15,6 +15,7 @@ import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.RemoteModel;
@ -63,17 +64,17 @@ public class TaskService {
private final FilterCounter filterCounter; private final FilterCounter filterCounter;
private final RefreshScheduler refreshScheduler; private final RefreshScheduler refreshScheduler;
private final TagService tagService; private final TagService tagService;
private final MetadataService metadataService; private final MetadataDao metadataDao;
@Inject @Inject
public TaskService(TaskDao taskDao, Broadcaster broadcaster, FilterCounter filterCounter, public TaskService(TaskDao taskDao, Broadcaster broadcaster, FilterCounter filterCounter,
RefreshScheduler refreshScheduler, TagService tagService, MetadataService metadataService) { RefreshScheduler refreshScheduler, TagService tagService, MetadataDao metadataDao) {
this.taskDao = taskDao; this.taskDao = taskDao;
this.broadcaster = broadcaster; this.broadcaster = broadcaster;
this.filterCounter = filterCounter; this.filterCounter = filterCounter;
this.refreshScheduler = refreshScheduler; this.refreshScheduler = refreshScheduler;
this.tagService = tagService; this.tagService = tagService;
this.metadataService = metadataService; this.metadataDao = metadataDao;
} }
// --- service layer // --- service layer
@ -289,7 +290,7 @@ public class TaskService {
tagService.createLink(task, metadata.getValue(TaskToTagMetadata.TAG_NAME)); tagService.createLink(task, metadata.getValue(TaskToTagMetadata.TAG_NAME));
} }
} else { } else {
metadataService.save(metadata); metadataDao.persist(metadata);
} }
} }

@ -23,10 +23,10 @@ import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener; import com.todoroo.astrid.adapter.TaskAdapter.OnCompletedTaskListener;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskAttachmentDao; import com.todoroo.astrid.dao.TaskAttachmentDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater.Node; import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater.Node;
import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater.OrderedListNodeVisitor; import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater.OrderedListNodeVisitor;
@ -55,17 +55,17 @@ public class OrderedMetadataListFragmentHelper<LIST> implements OrderedListFragm
private final ActivityPreferences preferences; private final ActivityPreferences preferences;
private final TaskAttachmentDao taskAttachmentDao; private final TaskAttachmentDao taskAttachmentDao;
private final TaskService taskService; private final TaskService taskService;
private final MetadataService metadataService; private final MetadataDao metadataDao;
private DraggableTaskAdapter taskAdapter; private DraggableTaskAdapter taskAdapter;
private LIST list; private LIST list;
public OrderedMetadataListFragmentHelper(ActivityPreferences preferences, TaskAttachmentDao taskAttachmentDao, TaskService taskService, MetadataService metadataService, TaskListFragment fragment, OrderedMetadataListUpdater<LIST> updater) { public OrderedMetadataListFragmentHelper(ActivityPreferences preferences, TaskAttachmentDao taskAttachmentDao, TaskService taskService, MetadataDao metadataDao, TaskListFragment fragment, OrderedMetadataListUpdater<LIST> updater) {
this.preferences = preferences; this.preferences = preferences;
this.taskAttachmentDao = taskAttachmentDao; this.taskAttachmentDao = taskAttachmentDao;
this.taskService = taskService; this.taskService = taskService;
this.metadataService = metadataService; this.metadataDao = metadataDao;
this.fragment = fragment; this.fragment = fragment;
this.updater = updater; this.updater = updater;
} }
@ -245,7 +245,7 @@ public class OrderedMetadataListFragmentHelper<LIST> implements OrderedListFragm
if(!TextUtils.isEmpty(childTask.getRecurrence())) { if(!TextUtils.isEmpty(childTask.getRecurrence())) {
Metadata metadata = updater.getTaskMetadata(node.taskId); Metadata metadata = updater.getTaskMetadata(node.taskId);
metadata.setValue(updater.indentProperty(), parentIndent); metadata.setValue(updater.indentProperty(), parentIndent);
metadataService.save(metadata); metadataDao.persist(metadata);
} }
model.setId(node.taskId); model.setId(node.taskId);

@ -7,9 +7,9 @@ package com.todoroo.astrid.subtasks;
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.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@ -19,7 +19,7 @@ import java.util.concurrent.atomic.AtomicReference;
abstract public class OrderedMetadataListUpdater<LIST> { abstract public class OrderedMetadataListUpdater<LIST> {
private MetadataService metadataService; private MetadataDao metadataDao;
public interface OrderedListIterator { public interface OrderedListIterator {
public void processTask(long taskId, Metadata metadata); public void processTask(long taskId, Metadata metadata);
@ -39,8 +39,8 @@ abstract public class OrderedMetadataListUpdater<LIST> {
abstract protected Metadata createEmptyMetadata(LIST list, long taskId); abstract protected Metadata createEmptyMetadata(LIST list, long taskId);
public OrderedMetadataListUpdater(MetadataService metadataService) { public OrderedMetadataListUpdater(MetadataDao metadataDao) {
this.metadataService = metadataService; this.metadataDao = metadataDao;
} }
protected void beforeIndent(LIST list) { protected void beforeIndent(LIST list) {
@ -291,7 +291,7 @@ abstract public class OrderedMetadataListUpdater<LIST> {
if(metadata.getSetValues().size() == 0) { if(metadata.getSetValues().size() == 0) {
return; return;
} }
metadataService.save(metadata); metadataDao.persist(metadata);
} }
// --- task cascading operations // --- task cascading operations

@ -26,7 +26,6 @@ import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import org.tasks.R; import org.tasks.R;
@ -55,13 +54,11 @@ public final class TagService {
}; };
private final MetadataDao metadataDao; private final MetadataDao metadataDao;
private final MetadataService metadataService;
private final TagDataDao tagDataDao; private final TagDataDao tagDataDao;
@Inject @Inject
public TagService(MetadataDao metadataDao, MetadataService metadataService, TagDataDao tagDataDao) { public TagService(MetadataDao metadataDao, TagDataDao tagDataDao) {
this.metadataDao = metadataDao; this.metadataDao = metadataDao;
this.metadataService = metadataService;
this.tagDataDao = tagDataDao; this.tagDataDao = tagDataDao;
} }
@ -259,7 +256,7 @@ public final class TagService {
*/ */
public String getTagWithCase(String tag) { public String getTagWithCase(String tag) {
String tagWithCase = tag; String tagWithCase = tag;
TodorooCursor<Metadata> tagMetadata = metadataService.query(Query.select(TaskToTagMetadata.TAG_NAME).where(TagService.tagEqIgnoreCase(tag, Criterion.all)).limit(1)); TodorooCursor<Metadata> tagMetadata = metadataDao.query(Query.select(TaskToTagMetadata.TAG_NAME).where(TagService.tagEqIgnoreCase(tag, Criterion.all)).limit(1));
try { try {
if (tagMetadata.getCount() > 0) { if (tagMetadata.getCount() > 0) {
tagMetadata.moveToFirst(); tagMetadata.moveToFirst();

@ -14,7 +14,6 @@ import com.todoroo.astrid.gtasks.GtasksMetadataService;
import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.gtasks.GtasksTaskListUpdater; import com.todoroo.astrid.gtasks.GtasksTaskListUpdater;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.SyncV2Service; import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.UpgradeService; import com.todoroo.astrid.service.UpgradeService;
@ -40,7 +39,6 @@ public class Tasks extends InjectingApplication {
@Inject TaskAttachmentDao taskAttachmentDao; @Inject TaskAttachmentDao taskAttachmentDao;
@Inject TaskListMetadataDao taskListMetadataDao; @Inject TaskListMetadataDao taskListMetadataDao;
@Inject TaskService taskService; @Inject TaskService taskService;
@Inject MetadataService metadataService;
@Inject UpgradeService upgradeService; @Inject UpgradeService upgradeService;
@Inject SyncV2Service syncV2Service; @Inject SyncV2Service syncV2Service;
@Inject GtasksPreferenceService gtasksPreferenceService; @Inject GtasksPreferenceService gtasksPreferenceService;

Loading…
Cancel
Save