Remove MetadataService

pull/189/head
Alex Baker 10 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.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.test.DatabaseTestCase;
import javax.inject.Inject;
@ -19,8 +20,15 @@ public class MetadataDaoTests extends DatabaseTestCase {
@Inject MetadataDao metadataDao;
@Inject TaskDao taskDao;
public static Property<?>[] KEYS = new Property<?>[] { Metadata.ID,
Metadata.KEY };
private Metadata metadata;
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
@ -33,6 +41,7 @@ public class MetadataDaoTests extends DatabaseTestCase {
// create "happy"
Metadata metadata = new Metadata();
metadata.setTask(1L);
metadata.setKey("happy");
assertTrue(metadataDao.persist(metadata));
cursor = metadataDao.query(
@ -46,6 +55,7 @@ public class MetadataDaoTests extends DatabaseTestCase {
// create "sad"
metadata = new Metadata();
metadata.setTask(1L);
metadata.setKey("sad");
assertTrue(metadataDao.persist(metadata));
cursor = metadataDao.query(Query.select(Metadata.ID));
@ -123,4 +133,40 @@ public class MetadataDaoTests extends DatabaseTestCase {
assertEquals(1, cursor.getCount());
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.TaskLists;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase;
@ -25,7 +25,7 @@ public class GtasksIndentActionTest extends DatabaseTestCase {
@Inject GtasksMetadataService gtasksMetadataService;
@Inject GtasksListService gtasksListService;
@Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject MetadataService metadataService;
@Inject MetadataDao metadataDao;
@Inject TaskService taskService;
@Inject GtasksMetadata gtasksMetadata;
@ -161,7 +161,7 @@ public class GtasksIndentActionTest extends DatabaseTestCase {
metadata.setValue(GtasksMetadata.ORDER, order);
metadata.setValue(GtasksMetadata.LIST_ID, "list");
metadata.setTask(newTask.getId());
metadataService.save(metadata);
metadataDao.persist(metadata);
return newTask;
}

@ -7,9 +7,9 @@ package com.todoroo.astrid.gtasks;
import android.content.Context;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase;
@ -45,7 +45,7 @@ public class GtasksMetadataServiceTest extends DatabaseTestCase {
@Inject GtasksTestPreferenceService preferences;
@Inject GtasksMetadataService gtasksMetadataService;
@Inject MetadataService metadataService;
@Inject MetadataDao metadataDao;
@Inject TaskService taskService;
@Inject GtasksMetadata gtasksMetadata;
@ -99,7 +99,7 @@ public class GtasksMetadataServiceTest extends DatabaseTestCase {
if (id != null)
metadata.setValue(GtasksMetadata.ID, id);
metadata.setTask(task.getId());
metadataService.save(metadata);
metadataDao.persist(metadata);
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.TaskLists;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase;
@ -27,7 +27,7 @@ public class GtasksTaskListUpdaterTest extends DatabaseTestCase {
@Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject GtasksListService gtasksListService;
@Inject GtasksMetadataService gtasksMetadataService;
@Inject MetadataService metadataService;
@Inject MetadataDao metadataDao;
@Inject TaskService taskService;
@Inject GtasksMetadata gtasksMetadata;
@ -184,7 +184,7 @@ public class GtasksTaskListUpdaterTest extends DatabaseTestCase {
metadata.setValue(GtasksMetadata.ORDER, order);
if(indent != VALUE_UNSET)
metadata.setValue(GtasksMetadata.INDENT, indent);
metadataService.save(metadata);
metadataDao.persist(metadata);
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.TaskLists;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.test.DatabaseTestCase;
@ -27,7 +27,7 @@ public class GtasksTaskMovingTest extends DatabaseTestCase {
@Inject GtasksListService gtasksListService;
@Inject GtasksMetadataService gtasksMetadataService;
@Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject MetadataService metadataService;
@Inject MetadataDao metadataDao;
@Inject TaskService taskService;
@Inject GtasksMetadata gtasksMetadata;
@ -287,7 +287,7 @@ public class GtasksTaskMovingTest extends DatabaseTestCase {
metadata.setValue(GtasksMetadata.ORDER, order);
if(indent != VALUE_UNSET)
metadata.setValue(GtasksMetadata.INDENT, indent);
metadataService.save(metadata);
metadataDao.persist(metadata);
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.reminders.ReminderServiceTest;
import com.todoroo.astrid.repeats.NewRepeatTests;
import com.todoroo.astrid.service.MetadataServiceTest;
import com.todoroo.astrid.service.QuickAddMarkupTest;
import com.todoroo.astrid.service.TitleParserTest;
import com.todoroo.astrid.subtasks.SubtasksHelperTest;
@ -44,8 +43,7 @@ import dagger.Provides;
ReminderServiceTest.class,
SubtasksHelperTest.class,
SubtasksMovingTest.class,
SyncModelTest.class,
MetadataServiceTest.class
SyncModelTest.class
})
public class TestModule {
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.CameraResultCallback;
import com.todoroo.astrid.alarms.AlarmService;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskAttachmentDao;
import com.todoroo.astrid.dao.UserActivityDao;
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.notes.EditNoteActivity;
import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TagService;
@ -167,7 +167,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
@Inject TaskService taskService;
@Inject TaskAttachmentDao taskAttachmentDao;
@Inject TagService tagService;
@Inject MetadataService metadataService;
@Inject MetadataDao metadataDao;
@Inject UserActivityDao userActivityDao;
@Inject TaskDeleter taskDeleter;
@Inject NotificationManager notificationManager;
@ -276,7 +276,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
private void instantiateEditNotes() {
if (showEditComments) {
long idParam = getActivity().getIntent().getLongExtra(TOKEN_ID, -1L);
editNotes = new EditNoteActivity(preferences, metadataService, userActivityDao,
editNotes = new EditNoteActivity(preferences, metadataDao, userActivityDao,
taskService, this, getView(), idParam);
editNotes.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));

@ -7,6 +7,7 @@ package com.todoroo.astrid.alarms;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ContentValues;
import android.content.Context;
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.Query;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.reminders.Notifications;
import com.todoroo.astrid.reminders.ReminderService;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.MetadataService.SynchronizeMetadataCallback;
import com.todoroo.astrid.service.SynchronizeMetadataCallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tasks.injection.ForApplication;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -48,12 +51,12 @@ public class AlarmService {
// --- data retrieval
private final MetadataService metadataService;
private MetadataDao metadataDao;
private final Context context;
@Inject
public AlarmService(MetadataService metadataService, @ForApplication Context context) {
this.metadataService = metadataService;
public AlarmService(MetadataDao metadataDao, @ForApplication Context context) {
this.metadataDao = metadataDao;
this.context = context;
}
@ -61,7 +64,7 @@ public class AlarmService {
* Return alarms for the given task. PLEASE CLOSE THE CURSOR!
*/
public TodorooCursor<Metadata> getAlarms(long taskId) {
return metadataService.query(Query.select(
return metadataDao.query(Query.select(
Metadata.PROPERTIES).where(MetadataCriteria.byTaskAndwithKey(
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);
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
public void beforeDeleteMetadata(Metadata m) {
// Cancel the alarm before the metadata is deleted
@ -104,7 +107,7 @@ public class AlarmService {
* @return todoroo cursor. PLEASE CLOSE THIS CURSOR!
*/
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))).
where(Criterion.and(TaskCriteria.isActive(), MetadataCriteria.withKey(AlarmFields.METADATA_KEY))));
}
@ -114,7 +117,7 @@ public class AlarmService {
* @return todoroo cursor. PLEASE CLOSE THIS CURSOR!
*/
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))).
where(Criterion.and(TaskCriteria.isActive(),
MetadataCriteria.byTaskAndwithKey(taskId, AlarmFields.METADATA_KEY))));
@ -187,4 +190,65 @@ public class AlarmService {
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.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService;
import org.slf4j.Logger;
@ -60,7 +60,7 @@ public class TasksXmlExporter {
// --- implementation
private final TagDataDao tagDataDao;
private final MetadataService metadataService;
private final MetadataDao metadataDao;
private final TaskService taskService;
private final Preferences preferences;
@ -86,9 +86,9 @@ public class TasksXmlExporter {
}
@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.metadataService = metadataService;
this.metadataDao = metadataDao;
this.taskService = taskService;
this.preferences = preferences;
}
@ -214,7 +214,7 @@ public class TasksXmlExporter {
}
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())));
try {
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.utility.DialogUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TaskToTagMetadata;
@ -49,7 +49,7 @@ public class TasksXmlImporter {
private static final Logger log = LoggerFactory.getLogger(TasksXmlImporter.class);
private final TagDataDao tagDataDao;
private final MetadataService metadataService;
private final MetadataDao metadataDao;
private final TaskService taskService;
private Context context;
@ -72,9 +72,9 @@ public class TasksXmlImporter {
}
@Inject
public TasksXmlImporter(TagDataDao tagDataDao, MetadataService metadataService, TaskService taskService) {
public TasksXmlImporter(TagDataDao tagDataDao, MetadataDao metadataDao, TaskService taskService) {
this.tagDataDao = tagDataDao;
this.metadataService = metadataService;
this.metadataDao = metadataDao;
this.taskService = taskService;
}
@ -276,7 +276,7 @@ public class TasksXmlImporter {
deserializeModel(metadata, Metadata.PROPERTIES);
metadata.setId(Metadata.NO_ID);
metadata.setTask(currentTask.getId());
metadataService.save(metadata);
metadataDao.persist(metadata);
// Construct the TagData from Metadata
// 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.DialogUtilities;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gcal.GCalHelper;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.utility.TodorooPreferenceActivity;
@ -41,7 +41,7 @@ public class OldTaskPreferences extends TodorooPreferenceActivity {
@Inject TaskDeleter taskDeleter;
@Inject TaskService taskService;
@Inject MetadataService metadataService;
@Inject MetadataDao metadataDao;
@Inject Database database;
@Inject GCalHelper gcalHelper;
@Inject Preferences preferences;
@ -195,7 +195,7 @@ public class OldTaskPreferences extends TodorooPreferenceActivity {
cursor.close();
}
int result = taskDeleter.purgeDeletedTasks();
metadataService.removeDanglingMetadata();
metadataDao.removeDanglingMetadata();
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.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.data.Metadata;
import com.todoroo.astrid.data.Task;
import java.util.ArrayList;
import java.util.HashSet;
@ -109,11 +111,22 @@ public class MetadataDao extends DatabaseDao<Metadata> {
@Override
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)) {
item.setCreationDate(DateUtilities.now());
}
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.DialogUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskAttachmentDao;
import com.todoroo.astrid.data.StoreObject;
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.TaskService;
import com.todoroo.astrid.subtasks.OrderedListFragmentHelperInterface;
@ -34,6 +33,7 @@ import org.tasks.R;
import org.tasks.injection.ForActivity;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.sync.IndeterminateProgressBarSyncResultCallback;
import org.tasks.sync.SyncThrottle;
import javax.inject.Inject;
@ -42,7 +42,7 @@ public class GtasksListFragment extends SubtasksListFragment {
public static final String TOKEN_STORE_ID = "storeId"; //$NON-NLS-1$
@Inject TaskService taskService;
@Inject MetadataService metadataService;
@Inject MetadataDao metadataDao;
@Inject StoreObjectDao storeObjectDao;
@Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject GtasksMetadataService gtasksMetadataService;
@ -66,7 +66,7 @@ public class GtasksListFragment extends SubtasksListFragment {
@Override
protected OrderedListFragmentHelperInterface<?> createFragmentHelper() {
return new OrderedMetadataListFragmentHelper<>(preferences, taskAttachmentDao, taskService, metadataService, this, gtasksTaskListUpdater);
return new OrderedMetadataListFragmentHelper<>(preferences, taskAttachmentDao, taskService, metadataDao, this, gtasksTaskListUpdater);
}
@Override

@ -21,7 +21,6 @@ import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.sync.GtasksTaskContainer;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater.OrderedListIterator;
import com.todoroo.astrid.utility.SyncMetadataService;
@ -41,12 +40,9 @@ import javax.inject.Singleton;
@Singleton
public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskContainer> {
private MetadataService metadataService;
@Inject
public GtasksMetadataService(TaskDao taskDao, MetadataDao metadataDao, MetadataService metadataService) {
public GtasksMetadataService(TaskDao taskDao, MetadataDao metadataDao) {
super(taskDao, metadataDao);
this.metadataService = metadataService;
}
public Criterion getLocalMatchCriteria(GtasksTaskContainer remoteTask) {
@ -111,7 +107,7 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
GtasksMetadata.LIST_ID.eq(listId),
startAtCriterion)).
orderBy(order);
TodorooCursor<Metadata> cursor = metadataService.query(query);
TodorooCursor<Metadata> cursor = metadataDao.query(query);
try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
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.Task;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater;
import org.slf4j.Logger;
@ -51,19 +50,16 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<StoreObjec
private final GtasksMetadataService gtasksMetadataService;
private final GtasksSyncService gtasksSyncService;
private final MetadataDao metadataDao;
private final MetadataService metadataService;
private final GtasksMetadata gtasksMetadata;
@Inject
public GtasksTaskListUpdater(GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService,
GtasksSyncService gtasksSyncService, MetadataDao metadataDao, MetadataService metadataService,
GtasksMetadata gtasksMetadata) {
super(metadataService);
GtasksSyncService gtasksSyncService, MetadataDao metadataDao, GtasksMetadata gtasksMetadata) {
super(metadataDao);
this.gtasksListService = gtasksListService;
this.gtasksMetadataService = gtasksMetadataService;
this.gtasksSyncService = gtasksSyncService;
this.metadataDao = metadataDao;
this.metadataService = metadataService;
this.gtasksMetadata = gtasksMetadata;
}
@ -142,7 +138,7 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<StoreObjec
}
metadata.setValue(GtasksMetadata.PARENT_TASK, parent);
metadataService.save(metadata);
metadataDao.persist(metadata);
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.MoveRequest;
import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService;
import org.slf4j.Logger;
@ -45,7 +44,6 @@ public class GtasksSyncService {
private static final String DEFAULT_LIST = "@default"; //$NON-NLS-1$
private final MetadataService metadataService;
private final MetadataDao metadataDao;
private final GtasksMetadataService gtasksMetadataService;
private final TaskDao taskDao;
@ -54,11 +52,9 @@ public class GtasksSyncService {
private final GtasksMetadata gtasksMetadataFactory;
@Inject
public GtasksSyncService(MetadataService metadataService, MetadataDao metadataDao,
GtasksMetadataService gtasksMetadataService, TaskDao taskDao,
GtasksPreferenceService gtasksPreferenceService,
public GtasksSyncService(MetadataDao metadataDao, GtasksMetadataService gtasksMetadataService,
TaskDao taskDao, GtasksPreferenceService gtasksPreferenceService,
GtasksTokenValidator gtasksTokenValidator, GtasksMetadata gtasksMetadataFactory) {
this.metadataService = metadataService;
this.metadataDao = metadataDao;
this.gtasksMetadataService = gtasksMetadataService;
this.taskDao = taskDao;
@ -316,7 +312,7 @@ public class GtasksSyncService {
task.setModificationDate(DateUtilities.now());
gtasksMetadata.setValue(GtasksMetadata.LAST_SYNC, DateUtilities.now() + 1000L);
metadataService.save(gtasksMetadata);
metadataDao.persist(gtasksMetadata);
task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
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.activity.AstridActivity;
import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.timers.TimerActionControlSet.TimerActionListener;
@ -70,7 +70,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
private Task task;
private final Preferences preferences;
private final MetadataService metadataService;
private final MetadataDao metadataDao;
private final UserActivityDao userActivityDao;
private final TaskService taskService;
private final ArrayList<NoteOrUpdate> items = new ArrayList<>();
@ -100,7 +100,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
public EditNoteActivity(
Preferences preferences,
MetadataService metadataService,
MetadataDao metadataDao,
UserActivityDao userActivityDao,
TaskService taskService,
Fragment fragment,
@ -108,7 +108,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
long t) {
super(fragment.getActivity());
this.preferences = preferences;
this.metadataService = metadataService;
this.metadataDao = metadataDao;
this.userActivityDao = userActivityDao;
this.taskService = taskService;
@ -260,7 +260,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
private void setUpListAdapter() {
items.clear();
this.removeAllViews();
TodorooCursor<Metadata> notes = metadataService.query(
TodorooCursor<Metadata> notes = metadataDao.query(
Query.select(Metadata.PROPERTIES).where(
MetadataCriteria.byTaskAndwithKey(task.getId(),
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.TasksXmlImporter;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.Metadata;
@ -73,7 +74,7 @@ public class StartupService {
private final Database database;
private final GtasksPreferenceService gtasksPreferenceService;
private final GtasksSyncService gtasksSyncService;
private final MetadataService metadataService;
private final MetadataDao metadataDao;
private final Preferences preferences;
private final TasksXmlImporter xmlImporter;
private final CalendarAlarmScheduler calendarAlarmScheduler;
@ -83,7 +84,7 @@ public class StartupService {
public StartupService(UpgradeService upgradeService, TaskService taskService,
TagDataDao tagDataDao, Database database,
GtasksPreferenceService gtasksPreferenceService,
GtasksSyncService gtasksSyncService, MetadataService metadataService,
GtasksSyncService gtasksSyncService, MetadataDao metadataDao,
Preferences preferences, TasksXmlImporter xmlImporter,
CalendarAlarmScheduler calendarAlarmScheduler, TaskDeleter taskDeleter) {
this.upgradeService = upgradeService;
@ -92,7 +93,7 @@ public class StartupService {
this.database = database;
this.gtasksPreferenceService = gtasksPreferenceService;
this.gtasksSyncService = gtasksSyncService;
this.metadataService = metadataService;
this.metadataDao = metadataDao;
this.preferences = preferences;
this.xmlImporter = xmlImporter;
this.calendarAlarmScheduler = calendarAlarmScheduler;
@ -216,7 +217,7 @@ public class StartupService {
if (values != null) {
if (values.containsKey(TagData.NAME.name)) {
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);
}
}

@ -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.DateUtilities;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel;
@ -63,17 +64,17 @@ public class TaskService {
private final FilterCounter filterCounter;
private final RefreshScheduler refreshScheduler;
private final TagService tagService;
private final MetadataService metadataService;
private final MetadataDao metadataDao;
@Inject
public TaskService(TaskDao taskDao, Broadcaster broadcaster, FilterCounter filterCounter,
RefreshScheduler refreshScheduler, TagService tagService, MetadataService metadataService) {
RefreshScheduler refreshScheduler, TagService tagService, MetadataDao metadataDao) {
this.taskDao = taskDao;
this.broadcaster = broadcaster;
this.filterCounter = filterCounter;
this.refreshScheduler = refreshScheduler;
this.tagService = tagService;
this.metadataService = metadataService;
this.metadataDao = metadataDao;
}
// --- service layer
@ -289,7 +290,7 @@ public class TaskService {
tagService.createLink(task, metadata.getValue(TaskToTagMetadata.TAG_NAME));
}
} 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.OnCompletedTaskListener;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskAttachmentDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater.Node;
import com.todoroo.astrid.subtasks.OrderedMetadataListUpdater.OrderedListNodeVisitor;
@ -55,17 +55,17 @@ public class OrderedMetadataListFragmentHelper<LIST> implements OrderedListFragm
private final ActivityPreferences preferences;
private final TaskAttachmentDao taskAttachmentDao;
private final TaskService taskService;
private final MetadataService metadataService;
private final MetadataDao metadataDao;
private DraggableTaskAdapter taskAdapter;
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.taskAttachmentDao = taskAttachmentDao;
this.taskService = taskService;
this.metadataService = metadataService;
this.metadataDao = metadataDao;
this.fragment = fragment;
this.updater = updater;
}
@ -245,7 +245,7 @@ public class OrderedMetadataListFragmentHelper<LIST> implements OrderedListFragm
if(!TextUtils.isEmpty(childTask.getRecurrence())) {
Metadata metadata = updater.getTaskMetadata(node.taskId);
metadata.setValue(updater.indentProperty(), parentIndent);
metadataService.save(metadata);
metadataDao.persist(metadata);
}
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.LongProperty;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
@ -19,7 +19,7 @@ import java.util.concurrent.atomic.AtomicReference;
abstract public class OrderedMetadataListUpdater<LIST> {
private MetadataService metadataService;
private MetadataDao metadataDao;
public interface OrderedListIterator {
public void processTask(long taskId, Metadata metadata);
@ -39,8 +39,8 @@ abstract public class OrderedMetadataListUpdater<LIST> {
abstract protected Metadata createEmptyMetadata(LIST list, long taskId);
public OrderedMetadataListUpdater(MetadataService metadataService) {
this.metadataService = metadataService;
public OrderedMetadataListUpdater(MetadataDao metadataDao) {
this.metadataDao = metadataDao;
}
protected void beforeIndent(LIST list) {
@ -291,7 +291,7 @@ abstract public class OrderedMetadataListUpdater<LIST> {
if(metadata.getSetValues().size() == 0) {
return;
}
metadataService.save(metadata);
metadataDao.persist(metadata);
}
// --- task cascading operations

@ -26,7 +26,6 @@ import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import org.tasks.R;
@ -55,13 +54,11 @@ public final class TagService {
};
private final MetadataDao metadataDao;
private final MetadataService metadataService;
private final TagDataDao tagDataDao;
@Inject
public TagService(MetadataDao metadataDao, MetadataService metadataService, TagDataDao tagDataDao) {
public TagService(MetadataDao metadataDao, TagDataDao tagDataDao) {
this.metadataDao = metadataDao;
this.metadataService = metadataService;
this.tagDataDao = tagDataDao;
}
@ -259,7 +256,7 @@ public final class TagService {
*/
public String getTagWithCase(String 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 {
if (tagMetadata.getCount() > 0) {
tagMetadata.moveToFirst();

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

Loading…
Cancel
Save