Convert TagDataDao to Room

pull/618/head
Alex Baker 7 years ago
parent c2255296d7
commit 5bee730f1c

@ -0,0 +1,110 @@
{
"formatVersion": 1,
"database": {
"version": 40,
"identityHash": "522b606947ecd5beebfb95d548aef0c4",
"entities": [
{
"tableName": "notification",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task` INTEGER NOT NULL, `timestamp` INTEGER NOT NULL, `type` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "uid",
"columnName": "uid",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "taskId",
"columnName": "task",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"uid"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_notification_task",
"unique": true,
"columnNames": [
"task"
],
"createSql": "CREATE UNIQUE INDEX `index_notification_task` ON `${TABLE_NAME}` (`task`)"
}
],
"foreignKeys": []
},
{
"tableName": "tagdata",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `remoteId` TEXT, `name` TEXT, `color` INTEGER, `tagOrdering` TEXT, `deleted` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "remoteId",
"columnName": "remoteId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "color",
"columnName": "color",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "tagOrdering",
"columnName": "tagOrdering",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "deleted",
"columnName": "deleted",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"522b606947ecd5beebfb95d548aef0c4\")"
]
}
}

@ -23,7 +23,7 @@ public class SyncModelTest extends NewSyncTestCase {
@Test @Test
public void testCreateTagMakesUuid() { public void testCreateTagMakesUuid() {
TagData tag = createTagData(); TagData tag = createTagData();
assertFalse(RemoteModel.NO_UUID.equals(tag.getUUID())); assertFalse(RemoteModel.NO_UUID.equals(tag.getRemoteId()));
} }
} }

@ -27,8 +27,8 @@ public class TagFilter extends Filter {
} }
public TagFilter(TagData tagData) { public TagFilter(TagData tagData) {
super(tagData.getName(), queryTemplate(tagData.getUuid()), getValuesForNewTask(tagData)); super(tagData.getName(), queryTemplate(tagData.getRemoteId()), getValuesForNewTask(tagData));
uuid = tagData.getUuid(); uuid = tagData.getRemoteId();
tint = tagData.getColor(); tint = tagData.getColor();
icon = TAG; icon = TAG;
} }
@ -51,7 +51,7 @@ public class TagFilter extends Filter {
ContentValues contentValues = new ContentValues(); ContentValues contentValues = new ContentValues();
contentValues.put(Metadata.KEY.name, TaskToTagMetadata.KEY); contentValues.put(Metadata.KEY.name, TaskToTagMetadata.KEY);
contentValues.put(TaskToTagMetadata.TAG_NAME.name, tagData.getName()); contentValues.put(TaskToTagMetadata.TAG_NAME.name, tagData.getName());
contentValues.put(TaskToTagMetadata.TAG_UUID.name, tagData.getUuid()); contentValues.put(TaskToTagMetadata.TAG_UUID.name, tagData.getRemoteId());
return contentValues; return contentValues;
} }

@ -30,6 +30,7 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
import org.tasks.R; import org.tasks.R;
import org.tasks.backup.XmlWriter;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.xmlpull.v1.XmlSerializer; import org.xmlpull.v1.XmlSerializer;
@ -164,7 +165,7 @@ public class TasksXmlExporter {
for (TagData tag : tagDataDao.allTags()) { for (TagData tag : tagDataDao.allTags()) {
try { try {
xml.startTag(null, BackupConstants.TAGDATA_TAG); xml.startTag(null, BackupConstants.TAGDATA_TAG);
serializeModel(tag, TagData.PROPERTIES, TagData.ID); tag.writeToXml(new XmlWriter(xml));
xml.endTag(null, BackupConstants.TAGDATA_TAG); xml.endTag(null, BackupConstants.TAGDATA_TAG);
} catch(IOException e) { } catch(IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);

@ -23,6 +23,7 @@ import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
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.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
@ -30,6 +31,7 @@ import com.todoroo.astrid.tags.TaskToTagMetadata;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
import org.tasks.R; import org.tasks.R;
import org.tasks.backup.XmlReader;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@ -156,7 +158,6 @@ public class TasksXmlImporter {
final Task currentTask = new Task(); final Task currentTask = new Task();
final UserActivity userActivity = new UserActivity(); final UserActivity userActivity = new UserActivity();
final Metadata metadata = new Metadata(); final Metadata metadata = new Metadata();
final TagData tagdata = new TagData();
public Format2TaskImporter() { } public Format2TaskImporter() { }
public Format2TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException { public Format2TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException {
@ -269,11 +270,11 @@ public class TasksXmlImporter {
//If you sync with Google tasks it adds some Google task metadata. //If you sync with Google tasks it adds some Google task metadata.
//For this metadata we don't create a list! //For this metadata we don't create a list!
if(key.equals(TaskToTagMetadata.KEY) && tagData == null && deletionDate == 0) { if(key.equals(TaskToTagMetadata.KEY) && tagData == null && deletionDate == 0) {
tagdata.clear(); tagData = new TagData();
tagdata.setId(TagData.NO_ID); tagData.setId(RemoteModel.NO_ID);
tagdata.setUuid(uuid); tagData.setRemoteId(uuid);
tagdata.setName(name); tagData.setName(name);
tagDataDao.persist(tagdata); tagDataDao.insert(tagData);
} }
} }
} }
@ -375,10 +376,9 @@ public class TasksXmlImporter {
} }
private void parseTagdata() { private void parseTagdata() {
tagdata.clear(); TagData tagData = new TagData(new XmlReader(xpp));
deserializeModel(tagdata, TagData.PROPERTIES); if (tagDataDao.getByUuid(tagData.getRemoteId()) == null) {
if (tagDataDao.getByUuid(tagdata.getUuid()) == null) { tagDataDao.insert(tagData);
tagDataDao.persist(tagdata);
} }
} }
} }

@ -36,10 +36,16 @@ import timber.log.Timber;
* @author Tim Su <tim@todoroo.com> * @author Tim Su <tim@todoroo.com>
* *
*/ */
@android.arch.persistence.room.Database(entities = {Notification.class}, version = 39) @android.arch.persistence.room.Database(
entities = {
Notification.class,
TagData.class
},
version = 40)
public abstract class Database extends RoomDatabase { public abstract class Database extends RoomDatabase {
public abstract NotificationDao notificationDao(); public abstract NotificationDao notificationDao();
public abstract TagDataDao getTagDataDao();
public static final String NAME = "database"; public static final String NAME = "database";
@ -47,7 +53,6 @@ public abstract class Database extends RoomDatabase {
Task.TABLE, Task.TABLE,
Metadata.TABLE, Metadata.TABLE,
StoreObject.TABLE, StoreObject.TABLE,
TagData.TABLE,
UserActivity.TABLE, UserActivity.TABLE,
TaskAttachment.TABLE, TaskAttachment.TABLE,
TaskListMetadata.TABLE, TaskListMetadata.TABLE,

@ -5,69 +5,50 @@
*/ */
package com.todoroo.astrid.dao; package com.todoroo.astrid.dao;
import com.todoroo.andlib.sql.Criterion; import android.arch.persistence.room.Dao;
import com.todoroo.andlib.sql.Functions; import android.arch.persistence.room.Insert;
import com.todoroo.andlib.sql.Order; import android.arch.persistence.room.OnConflictStrategy;
import com.todoroo.andlib.sql.Query; import android.arch.persistence.room.Query;
import com.todoroo.astrid.data.TagData;
import org.tasks.injection.ApplicationScope; import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.helper.UUIDHelper;
import java.util.List; import java.util.List;
import javax.inject.Inject; @Dao
public abstract class TagDataDao {
/** @Query("SELECT * FROM tagdata WHERE name = :name COLLATE NOCASE LIMIT 1")
* Data Access layer for {@link TagData}-related operations. public abstract TagData getTagByName(String name);
*
* @author Tim Su <tim@todoroo.com>
*/
@ApplicationScope
public class TagDataDao {
private final RemoteModelDao<TagData> dao; // TODO: does this need to be ordered?
@Query("SELECT * FROM tagdata WHERE deleted = 0 ORDER BY _id ASC")
public abstract List<TagData> allTags();
@Inject @Query("SELECT * FROM tagdata WHERE remoteId = :uuid LIMIT 1")
public TagDataDao(Database database) { public abstract TagData getByUuid(String uuid);
dao = new RemoteModelDao<>(database, TagData.class);
}
public TagData getTagByName(String name) { @Query("SELECT * FROM tagdata WHERE deleted = 0 AND name IS NOT NULL ORDER BY UPPER(name) ASC")
return dao.getFirst(Query.select(TagData.PROPERTIES).where(TagData.NAME.eqCaseInsensitive(name))); public abstract List<TagData> tagDataOrderedByName();
}
public List<TagData> allTags() { @Insert(onConflict = OnConflictStrategy.REPLACE)
// TODO: does this need to be ordered? public abstract void persist(TagData tagData);
return dao.toList(Query.select(TagData.PROPERTIES)
.where(TagData.DELETION_DATE.eq(0))
.orderBy(Order.asc(TagData.ID)));
}
public TagData getByUuid(String uuid) { @Query("UPDATE tagdata SET name = :name WHERE remoteId = :remoteId")
return dao.getFirst(Query.select(TagData.PROPERTIES).where(TagData.UUID.eq(uuid))); public abstract void rename(String remoteId, String name);
}
public List<TagData> tagDataOrderedByName() {
return dao.toList(Query.select(TagData.PROPERTIES).where(Criterion.and(
TagData.DELETION_DATE.eq(0),
TagData.NAME.isNotNull()))
.orderBy(Order.asc(Functions.upper(TagData.NAME))));
}
public void persist(TagData tagData) { @Query("DELETE FROM tagdata WHERE _id = :id")
dao.persist(tagData); public abstract void delete(Long id);
}
public void update(Criterion where, TagData template) { @Insert
dao.update(where, template); public abstract void insert(TagData tag);
}
public void delete(long id) {
dao.delete(id);
}
public void createNew(TagData tag) { public void createNew(TagData tag) {
dao.createNew(tag); if (RemoteModel.isUuidEmpty(tag.getRemoteId())) {
tag.setRemoteId(UUIDHelper.newUUID());
}
insert(tag);
} }
} }

@ -1,121 +1,180 @@
/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.data; package com.todoroo.astrid.data;
import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.Ignore;
import android.arch.persistence.room.PrimaryKey;
import android.os.Parcel;
import android.os.Parcelable;
import android.content.ContentValues; import org.tasks.backup.XmlReader;
import org.tasks.backup.XmlWriter;
import com.todoroo.andlib.data.Property; @Entity(tableName = "tagdata")
import com.todoroo.andlib.data.Property.IntegerProperty; public final class TagData implements Parcelable {
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.Table;
/** @PrimaryKey(autoGenerate = true)
* Data Model which represents a collaboration space for users / tasks. @ColumnInfo(name = "_id")
* private Long id;
* @author Tim Su <tim@todoroo.com>
*
*/
public final class TagData extends RemoteModel {
// --- table and uri @ColumnInfo(name = "remoteId")
private String remoteId = RemoteModel.NO_UUID;
/** table for this model */ @ColumnInfo(name = "name")
public static final Table TABLE = new Table("tagdata", TagData.class); private String name = "";
// --- properties @ColumnInfo(name = "color")
private Integer color = -1;
/** ID */ @ColumnInfo(name = "tagOrdering")
public static final LongProperty ID = new LongProperty( private String tagOrdering = "[]";
TABLE, ID_PROPERTY_NAME);
/** Remote goal id */ @Deprecated
public static final StringProperty UUID = new StringProperty( @ColumnInfo(name = "deleted")
TABLE, UUID_PROPERTY_NAME); private Long deleted = 0L;
/** Name of Tag */ public TagData() {
public static final StringProperty NAME = new StringProperty( }
TABLE, "name");
public static final IntegerProperty COLOR = new IntegerProperty( @Ignore
TABLE, "color"); public TagData(XmlReader reader) {
reader.readString("remoteId", this::setRemoteId);
reader.readString("name", this::setName);
reader.readInteger("color", this::setColor);
reader.readString("tagOrdering", this::setTagOrdering);
reader.readLong("deleted", this::setDeleted);
}
/** Unixtime Project was deleted. 0 means not deleted */ @Ignore
@Deprecated private TagData(Parcel parcel) {
public static final LongProperty DELETION_DATE = new LongProperty( id = parcel.readLong();
TABLE, "deleted", Property.PROP_FLAG_DATE); remoteId = parcel.readString();
name = parcel.readString();
color = parcel.readInt();
tagOrdering = parcel.readString();
deleted = parcel.readLong();
}
/** Tag ordering */ public void writeToXml(XmlWriter writer) {
@Deprecated writer.writeString("remoteId", remoteId);
public static final StringProperty TAG_ORDERING = new StringProperty( writer.writeString("name", name);
TABLE, "tagOrdering"); writer.writeInteger("color", color);
writer.writeString("tagOrdering", tagOrdering);
writer.writeLong("deleted", deleted);
}
/** List of all properties for this model */ public Long getId() {
public static final Property<?>[] PROPERTIES = generateProperties(TagData.class); return id;
}
// --- defaults public void setId(long id) {
this.id = id;
}
/** Default values container */ public String getRemoteId() {
private static final ContentValues defaultValues = new ContentValues(); return remoteId;
}
static { public void setRemoteId(String remoteId) {
defaultValues.put(UUID.name, NO_UUID); this.remoteId = remoteId;
defaultValues.put(NAME.name, "");
defaultValues.put(DELETION_DATE.name, 0);
defaultValues.put(TAG_ORDERING.name, "[]");
defaultValues.put(COLOR.name, -1);
} }
@Override public String getName() {
public ContentValues getDefaultValues() { return name;
return defaultValues;
} }
@Override public void setName(String name) {
public long getId() { this.name = name;
return getIdHelper(ID);
} }
public String getUuid() { public String getTagOrdering() {
return getUuidHelper(UUID); return tagOrdering;
} }
// --- parcelable helpers public void setTagOrdering(String tagOrdering) {
this.tagOrdering = tagOrdering;
}
public static final Creator<TagData> CREATOR = new ModelCreator<>(TagData.class); public Integer getColor() {
return color;
}
// --- data access methods public void setColor(int color) {
this.color = color;
}
public String getName() { public Long getDeleted() {
return getValue(NAME); return deleted;
} }
public void setName(String name) { public void setDeleted(long deleted) {
setValue(NAME, name); this.deleted = deleted;
} }
public String getTagOrdering() { public static final Creator<TagData> CREATOR = new Creator<TagData>() {
return getValue(TAG_ORDERING); @Override
public TagData createFromParcel(Parcel source) {
return new TagData(source);
}
@Override
public TagData[] newArray(int size) {
return new TagData[size];
}
};
@Override
public int describeContents() {
return 0;
} }
public void setColor(int color) { @Override
setValue(COLOR, color); public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(id);
dest.writeString(remoteId);
dest.writeString(name);
dest.writeInt(color);
dest.writeString(tagOrdering);
dest.writeLong(deleted);
} }
public int getColor() { @Override
return getValue(COLOR); public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TagData tagData = (TagData) o;
if (id != null ? !id.equals(tagData.id) : tagData.id != null) return false;
if (remoteId != null ? !remoteId.equals(tagData.remoteId) : tagData.remoteId != null)
return false;
if (name != null ? !name.equals(tagData.name) : tagData.name != null) return false;
if (color != null ? !color.equals(tagData.color) : tagData.color != null) return false;
if (tagOrdering != null ? !tagOrdering.equals(tagData.tagOrdering) : tagData.tagOrdering != null)
return false;
return deleted != null ? deleted.equals(tagData.deleted) : tagData.deleted == null;
} }
// TODO: remove? @Override
public String getUUID() { public int hashCode() {
return getValue(UUID); int result = id != null ? id.hashCode() : 0;
result = 31 * result + (remoteId != null ? remoteId.hashCode() : 0);
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (color != null ? color.hashCode() : 0);
result = 31 * result + (tagOrdering != null ? tagOrdering.hashCode() : 0);
result = 31 * result + (deleted != null ? deleted.hashCode() : 0);
return result;
} }
public void setUUID(String uuid) { @Override
setValue(UUID, uuid); public String toString() {
return "TagData{" +
"id=" + id +
", remoteId='" + remoteId + '\'' +
", name='" + name + '\'' +
", color=" + color +
", tagOrdering='" + tagOrdering + '\'' +
", deleted=" + deleted +
'}';
} }
} }

@ -137,7 +137,7 @@ public class StartupService {
} }
private void removeDuplicateTags() { private void removeDuplicateTags() {
ListMultimap<String, TagData> tagsByUuid = Multimaps.index(tagService.getTagList(), TagData::getUuid); ListMultimap<String, TagData> tagsByUuid = Multimaps.index(tagService.getTagList(), TagData::getRemoteId);
for (String uuid : tagsByUuid.keySet()) { for (String uuid : tagsByUuid.keySet()) {
removeDuplicateTagData(tagsByUuid.get(uuid)); removeDuplicateTagData(tagsByUuid.get(uuid));
removeDuplicateTagMetadata(uuid); removeDuplicateTagMetadata(uuid);

@ -148,7 +148,7 @@ public class TaskCreator {
tagData.setName(tagName); tagData.setName(tagName);
tagDataDao.persist(tagData); tagDataDao.persist(tagData);
} }
createLink(task, tagData.getName(), tagData.getUUID()); createLink(task, tagData.getName(), tagData.getRemoteId());
} }
private void createLink(Task task, String tagName, String tagUuid) { private void createLink(Task task, String tagName, String tagUuid) {

@ -66,7 +66,7 @@ public class SubtasksHelper {
TagData tagData = tagDataDao.getTagByName(filter.listingTitle); TagData tagData = tagDataDao.getTagByName(filter.listingTitle);
TaskListMetadata tlm = null; TaskListMetadata tlm = null;
if (tagData != null) { if (tagData != null) {
tlm = taskListMetadataDao.fetchByTagId(tagData.getUuid()); tlm = taskListMetadataDao.fetchByTagId(tagData.getRemoteId());
} else if (BuiltInFilterExposer.isInbox(context, filter)) { } else if (BuiltInFilterExposer.isInbox(context, filter)) {
tlm = taskListMetadataDao.fetchByTagId(TaskListMetadata.FILTER_ID_ALL); tlm = taskListMetadataDao.fetchByTagId(TaskListMetadata.FILTER_ID_ALL);
} else if (BuiltInFilterExposer.isTodayFilter(context, filter)) { } else if (BuiltInFilterExposer.isTodayFilter(context, filter)) {

@ -48,8 +48,8 @@ public class SubtasksTagListFragment extends TagListFragment {
@Override @Override
public void setTaskAdapter() { public void setTaskAdapter() {
String tdId = tagData.getUuid(); String tdId = tagData.getRemoteId();
TaskListMetadata taskListMetadata = taskListMetadataDao.fetchByTagId(tagData.getUuid()); TaskListMetadata taskListMetadata = taskListMetadataDao.fetchByTagId(tagData.getRemoteId());
if (taskListMetadata == null && !RemoteModel.isUuidEmpty(tdId)) { if (taskListMetadata == null && !RemoteModel.isUuidEmpty(tdId)) {
taskListMetadata = new TaskListMetadata(); taskListMetadata = new TaskListMetadata();
taskListMetadata.setTagUUID(tdId); taskListMetadata.setTagUUID(tdId);

@ -156,9 +156,7 @@ public final class TagService {
} }
public int rename(String uuid, String newName) { public int rename(String uuid, String newName) {
TagData template = new TagData(); tagDataDao.rename(uuid, newName);
template.setName(newName);
tagDataDao.update(TagData.UUID.eq(uuid), template);
Metadata metadataTemplate = new Metadata(); Metadata metadataTemplate = new Metadata();
metadataTemplate.setValue(TaskToTagMetadata.TAG_NAME, newName); metadataTemplate.setValue(TaskToTagMetadata.TAG_NAME, newName);

@ -390,7 +390,7 @@ public final class TagsControlSet extends TaskEditControlFragment {
*/ */
private boolean synchronizeTags(long taskId, String taskUuid) { private boolean synchronizeTags(long taskId, String taskUuid) {
for (TagData tagData : selectedTags) { for (TagData tagData : selectedTags) {
if (RemoteModel.NO_UUID.equals(tagData.getUuid())) { if (RemoteModel.NO_UUID.equals(tagData.getRemoteId())) {
tagDataDao.persist(tagData); tagDataDao.persist(tagData);
} }
} }
@ -400,7 +400,7 @@ public final class TagsControlSet extends TaskEditControlFragment {
Sets.SetView<TagData> removed = difference(existingHash, selectedHash); Sets.SetView<TagData> removed = difference(existingHash, selectedHash);
deleteLinks(taskId, taskUuid, filter(removed, notNull())); deleteLinks(taskId, taskUuid, filter(removed, notNull()));
for (TagData tagData : added) { for (TagData tagData : added) {
Metadata newLink = TaskToTagMetadata.newTagMetadata(taskId, taskUuid, tagData.getName(), tagData.getUuid()); Metadata newLink = TaskToTagMetadata.newTagMetadata(taskId, taskUuid, tagData.getName(), tagData.getRemoteId());
metadataDao.createNew(newLink); metadataDao.createNew(newLink);
} }
return !removed.isEmpty() || !added.isEmpty(); return !removed.isEmpty() || !added.isEmpty();
@ -416,9 +416,9 @@ public final class TagsControlSet extends TaskEditControlFragment {
for (TagData tag : tags) { for (TagData tag : tags) {
// TODO: Right now this is in a loop because each deleteTemplate needs the individual tagUuid in order to record // TODO: Right now this is in a loop because each deleteTemplate needs the individual tagUuid in order to record
// the outstanding entry correctly. If possible, this should be improved to a single query // the outstanding entry correctly. If possible, this should be improved to a single query
deleteTemplate.setValue(TaskToTagMetadata.TAG_UUID, tag.getUuid()); // Need this for recording changes in outstanding table deleteTemplate.setValue(TaskToTagMetadata.TAG_UUID, tag.getRemoteId()); // Need this for recording changes in outstanding table
metadataDao.update(Criterion.and(MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY), Metadata.DELETION_DATE.eq(0), metadataDao.update(Criterion.and(MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY), Metadata.DELETION_DATE.eq(0),
TaskToTagMetadata.TASK_UUID.eq(taskUuid), TaskToTagMetadata.TAG_UUID.eq(tag.getUuid())), deleteTemplate); TaskToTagMetadata.TASK_UUID.eq(taskUuid), TaskToTagMetadata.TAG_UUID.eq(tag.getRemoteId())), deleteTemplate);
} }
} }

@ -90,7 +90,7 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem
if (tagData == null) { if (tagData == null) {
isNewTag = true; isNewTag = true;
tagData = new TagData(); tagData = new TagData();
tagData.setUUID(UUIDHelper.newUUID()); tagData.setRemoteId(UUIDHelper.newUUID());
} }
if (savedInstanceState == null) { if (savedInstanceState == null) {
selectedTheme = tagData.getColor(); selectedTheme = tagData.getColor();
@ -195,13 +195,13 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem
} else if (hasChanges()) { } else if (hasChanges()) {
tagData.setName(newName); tagData.setName(newName);
tagData.setColor(selectedTheme); tagData.setColor(selectedTheme);
tagService.rename(tagData.getUuid(), newName); tagService.rename(tagData.getRemoteId(), newName);
tagDataDao.persist(tagData); tagDataDao.persist(tagData);
Metadata m = new Metadata(); Metadata m = new Metadata();
m.setValue(TaskToTagMetadata.TAG_NAME, newName); m.setValue(TaskToTagMetadata.TAG_NAME, newName);
metadataDao.update(Criterion.and( metadataDao.update(Criterion.and(
MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY), MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY),
TaskToTagMetadata.TAG_UUID.eq(tagData.getUUID())), m); TaskToTagMetadata.TAG_UUID.eq(tagData.getRemoteId())), m);
setResult(RESULT_OK, new Intent(ACTION_RELOAD).putExtra(TaskListActivity.OPEN_FILTER, new TagFilter(tagData))); setResult(RESULT_OK, new Intent(ACTION_RELOAD).putExtra(TaskListActivity.OPEN_FILTER, new TagFilter(tagData)));
} }
@ -249,7 +249,7 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem
dialogBuilder.newMessageDialog(R.string.delete_tag_confirmation, tagData.getName()) dialogBuilder.newMessageDialog(R.string.delete_tag_confirmation, tagData.getName())
.setPositiveButton(R.string.delete, (dialog, which) -> { .setPositiveButton(R.string.delete, (dialog, which) -> {
if (tagData != null) { if (tagData != null) {
String uuid = tagData.getUuid(); String uuid = tagData.getRemoteId();
metadataDao.deleteWhere(Criterion.and(MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_UUID.eq(uuid))); metadataDao.deleteWhere(Criterion.and(MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_UUID.eq(uuid)));
tagDataDao.delete(tagData.getId()); tagDataDao.delete(tagData.getId());
setResult(RESULT_OK, new Intent(ACTION_DELETED).putExtra(EXTRA_TAG_UUID, uuid)); setResult(RESULT_OK, new Intent(ACTION_DELETED).putExtra(EXTRA_TAG_UUID, uuid));

@ -0,0 +1,41 @@
package org.tasks.backup;
import com.todoroo.astrid.backup.TasksXmlExporter;
import org.xmlpull.v1.XmlPullParser;
public class XmlReader {
public interface ValueWriter<T> {
void write(T value);
}
private final XmlPullParser xpp;
public XmlReader(XmlPullParser xpp) {
this.xpp = xpp;
}
public void readLong(String name, ValueWriter<Long> writer) {
String value = xpp.getAttributeValue(null, name);
if(value != null) {
writer.write(TasksXmlExporter.XML_NULL.equals(value) ?
null : Long.parseLong(value));
}
}
public void readInteger(String name, ValueWriter<Integer> writer) {
String value = xpp.getAttributeValue(null, name);
if(value != null) {
writer.write(TasksXmlExporter.XML_NULL.equals(value) ?
null : Integer.parseInt(value));
}
}
public void readString(String name, ValueWriter<String> writer) {
String value = xpp.getAttributeValue(null, name);
if (value != null) {
writer.write(value);
}
}
}

@ -0,0 +1,54 @@
package org.tasks.backup;
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
import timber.log.Timber;
import static com.todoroo.astrid.backup.TasksXmlExporter.XML_NULL;
public class XmlWriter {
private final XmlSerializer xml;
public XmlWriter(XmlSerializer xml) {
this.xml = xml;
}
public void writeLong(String name, Long value) {
try {
String valueString = (value == null) ? XML_NULL : value.toString();
xml.attribute(null, name, valueString);
} catch (UnsupportedOperationException e) {
// didn't read this value, do nothing
Timber.e(e, e.getMessage());
} catch (IllegalArgumentException | IOException | IllegalStateException e) {
throw new RuntimeException(e);
}
}
public void writeString(String name, String value) {
try {
if(value != null) {
xml.attribute(null, name, value);
}
} catch (UnsupportedOperationException e) {
// didn't read this value, do nothing
Timber.v(e, e.getMessage());
} catch (IllegalArgumentException | IOException | IllegalStateException e) {
throw new RuntimeException(e);
}
}
public void writeInteger(String name, Integer value) {
try {
String valueString = (value == null) ? XML_NULL : value.toString();
xml.attribute(null, name, valueString);
} catch (UnsupportedOperationException e) {
// didn't read this value, do nothing
Timber.e(e, e.getMessage());
} catch (IllegalArgumentException | IOException | IllegalStateException e) {
throw new RuntimeException(e);
}
}
}

@ -44,11 +44,19 @@ public class Migrations {
} }
}; };
private static final Migration MIGRATION_39_40 = new Migration(39, 40) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
}
};
public static Migration[] MIGRATIONS = new Migration[] { public static Migration[] MIGRATIONS = new Migration[] {
MIGRATION_35_36, MIGRATION_35_36,
MIGRATION_36_37, MIGRATION_36_37,
MIGRATION_37_38, MIGRATION_37_38,
MIGRATION_38_39 MIGRATION_38_39,
MIGRATION_39_40
}; };
public static RoomDatabase.Callback ON_CREATE = new RoomDatabase.Callback() { public static RoomDatabase.Callback ON_CREATE = new RoomDatabase.Callback() {

@ -4,6 +4,7 @@ import android.arch.persistence.room.Room;
import android.content.Context; import android.content.Context;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.provider.Astrid2TaskProvider; import com.todoroo.astrid.provider.Astrid2TaskProvider;
import org.tasks.ErrorReportingSingleThreadExecutor; import org.tasks.ErrorReportingSingleThreadExecutor;
@ -50,6 +51,7 @@ public class ApplicationModule {
public Database getAppDatabase() { public Database getAppDatabase() {
return Room return Room
.databaseBuilder(context, Database.class, Database.NAME) .databaseBuilder(context, Database.class, Database.NAME)
.allowMainThreadQueries() // TODO: remove me
.addMigrations(Migrations.MIGRATIONS) .addMigrations(Migrations.MIGRATIONS)
.addCallback(Migrations.ON_CREATE) .addCallback(Migrations.ON_CREATE)
.build() .build()
@ -60,4 +62,9 @@ public class ApplicationModule {
public NotificationDao getNotificationDao(Database database) { public NotificationDao getNotificationDao(Database database) {
return database.notificationDao(); return database.notificationDao();
} }
@Provides
public TagDataDao getTagDataDao(Database database) {
return database.getTagDataDao();
}
} }

@ -48,7 +48,7 @@ public class TagFormatter {
tagCharacters = typedValue.getFloat(); tagCharacters = typedValue.getFloat();
for (TagData tagData : tagService.getTagList()) { for (TagData tagData : tagService.getTagList()) {
tagMap.put(tagData.getUuid(), tagData); tagMap.put(tagData.getRemoteId(), tagData);
} }
} }

Loading…
Cancel
Save