Added a tag metadata table for things like tag to user join table

pull/14/head
Sam Bosley 12 years ago
parent b1d32f61b4
commit f3cced5d02

@ -0,0 +1,99 @@
package com.todoroo.astrid.data;
import android.content.ContentValues;
import android.net.Uri;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.astrid.api.AstridApiConstants;
@SuppressWarnings("nls")
public class TagMetadata extends AbstractModel {
public static final Table TABLE = new Table("tag_metadata", TagMetadata.class);
/** content uri for this model */
public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.API_PACKAGE + "/" +
TABLE.name);
// --- properties
/** ID */
public static final LongProperty ID = new LongProperty(
TABLE, ID_PROPERTY_NAME);
/** Tag uuid */
public static final StringProperty TAG_UUID = new StringProperty(
TABLE, "tag_uuid");
/** Metadata Key */
public static final StringProperty KEY = new StringProperty(
TABLE, "key");
/** Metadata Text Value Column 1 */
public static final StringProperty VALUE1 = new StringProperty(
TABLE, "value");
/** Metadata Text Value Column 2 */
public static final StringProperty VALUE2 = new StringProperty(
TABLE, "value2");
/** Metadata Text Value Column 3 */
public static final StringProperty VALUE3 = new StringProperty(
TABLE, "value3");
/** Unixtime Metadata was created */
public static final LongProperty CREATION_DATE = new LongProperty(
TABLE, "created");
/** Unixtime metadata was deleted/tombstoned */
public static final LongProperty DELETION_DATE = new LongProperty(
TABLE, "deleted");
/** List of all properties for this model */
public static final Property<?>[] PROPERTIES = generateProperties(TagMetadata.class);
/** Default values container */
private static final ContentValues defaultValues = new ContentValues();
static {
defaultValues.put(DELETION_DATE.name, 0L);
}
@Override
public ContentValues getDefaultValues() {
return defaultValues;
}
public TagMetadata() {
super();
}
public TagMetadata(TodorooCursor<TagMetadata> cursor) {
this();
readPropertiesFromCursor(cursor);
}
public void readFromCursor(TodorooCursor<Metadata> cursor) {
super.readPropertiesFromCursor(cursor);
}
@Override
public long getId() {
return getIdHelper(ID);
}
// --- parcelable helpers
private static final Creator<TagMetadata> CREATOR = new ModelCreator<TagMetadata>(TagMetadata.class);
@Override
protected Creator<? extends AbstractModel> getCreator() {
return CREATOR;
}
}

@ -53,8 +53,11 @@ import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.actfm.sync.ActFmSyncService; import com.todoroo.astrid.actfm.sync.ActFmSyncService;
import com.todoroo.astrid.activity.TaskEditFragment; import com.todoroo.astrid.activity.TaskEditFragment;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.dao.UserDao; import com.todoroo.astrid.dao.UserDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.TagMetadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.User; import com.todoroo.astrid.data.User;
import com.todoroo.astrid.helper.AsyncImageView; import com.todoroo.astrid.helper.AsyncImageView;
@ -65,6 +68,7 @@ import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TagDataService; import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.abtesting.ABChooser; import com.todoroo.astrid.service.abtesting.ABChooser;
import com.todoroo.astrid.tags.TagMemberMetadata;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.ui.PeopleContainer; import com.todoroo.astrid.ui.PeopleContainer;
import com.todoroo.astrid.ui.PeopleContainer.ParseSharedException; import com.todoroo.astrid.ui.PeopleContainer.ParseSharedException;
@ -176,7 +180,6 @@ public class EditPeopleControlSet extends PopupControlSet {
this.task = task; this.task = task;
} }
@SuppressWarnings("nls")
public void setUpData(final Task task, final TagData includeTag) { public void setUpData(final Task task, final TagData includeTag) {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
@ -187,26 +190,13 @@ public class EditPeopleControlSet extends PopupControlSet {
TagData tagData = new TagData(); TagData tagData = new TagData();
for(tags.moveToFirst(); !tags.isAfterLast(); tags.moveToNext()) { for(tags.moveToFirst(); !tags.isAfterLast(); tags.moveToNext()) {
tagData.readFromCursor(tags); tagData.readFromCursor(tags);
final String tag = tagData.getValue(TagData.NAME); addMembersFromTagData(tagData, sharedPeople);
if(tagData.getValue(TagData.MEMBER_COUNT) > 0) {
try {
addMembersFromTagData(tagData, tag, sharedPeople);
} catch (JSONException e) {
exceptionService.reportError("json-reading-data", e);
}
}
} }
if (includeTag != null && tags.getCount() == 0) { if (includeTag != null && tags.getCount() == 0) {
try { addMembersFromTagData(includeTag, sharedPeople);
addMembersFromTagData(includeTag, null, sharedPeople);
} catch (JSONException e) {
exceptionService.reportError("json-reading-data", e);
}
} }
// if(collaborators.size() > 0)
// buildCollaborators(collaborators);
buildAssignedToSpinner(task, sharedPeople); buildAssignedToSpinner(task, sharedPeople);
} finally { } finally {
tags.close(); tags.close();
@ -216,55 +206,34 @@ public class EditPeopleControlSet extends PopupControlSet {
}).start(); }).start();
} }
@SuppressWarnings("nls") private static void addMembersFromTagData(TagData tagData, ArrayList<JSONObject> sharedPeople) {
private static void addMembersFromTagData(TagData tagData, String tag, ArrayList<JSONObject> sharedPeople) throws JSONException { try {
JSONArray members = new JSONArray(tagData.getValue(TagData.MEMBERS)); JSONArray members = new JSONArray(tagData.getValue(TagData.MEMBERS));
if (tag == null)
tag = tagData.getValue(TagData.NAME);
for (int i = 0; i < members.length(); i++) { for (int i = 0; i < members.length(); i++) {
JSONObject user = members.getJSONObject(i); JSONObject user = members.getJSONObject(i);
user.put("tag", tag);
sharedPeople.add(user); sharedPeople.add(user);
} }
if(!TextUtils.isEmpty(tagData.getValue(TagData.USER))) { if(!TextUtils.isEmpty(tagData.getValue(TagData.USER))) {
JSONObject user = new JSONObject(tagData.getValue(TagData.USER)); JSONObject user = new JSONObject(tagData.getValue(TagData.USER));
user.put("tag", tag);
sharedPeople.add(user); sharedPeople.add(user);
} }
} } catch (JSONException e) {
TodorooCursor<User> users = PluginServices.getUserDao().query(Query.select(User.PROPERTIES).where(User.UUID.in(
// @SuppressWarnings("nls") Query.select(TagMemberMetadata.USER_UUID).from(Metadata.TABLE).where(TagMetadata.TAG_UUID.eq(tagData.getUuid())))));
// private void buildCollaborators(final ArrayList<JSONObject> sharedPeople) { User user = new User();
// for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) {
// activity.runOnUiThread(new Runnable() { user.clear();
// @Override user.readFromCursor(users);
// public void run() { JSONObject userJson = new JSONObject();
// HashSet<Long> userIds = new HashSet<Long>(); try {
// LinearLayout collaborators = (LinearLayout) getSharedWithView().findViewById(R.id.collaborators); ActFmSyncService.JsonHelper.jsonFromUser(userJson, user);
// sharedPeople.add(userJson);
// for(JSONObject person : sharedPeople) { } catch (JSONException e2) {
// if(person == null)
// continue;
// long id = person.optLong("id", -1);
// if(id == 0 || id == ActFmPreferenceService.userId() || (id > -1 && userIds.contains(id)))
// continue;
// userIds.add(id);
//
// View contact = activity.getLayoutInflater().inflate(R.layout.contact_adapter_row, collaborators, false);
// AsyncImageView icon = (AsyncImageView) contact.findViewById(R.id.icon);
// TextView name = (TextView) contact.findViewById(android.R.id.text1);
// TextView tag = (TextView) contact.findViewById(android.R.id.text2);
//
// icon.setUrl(person.optString("picture"));
// name.setText(person.optString("name"));
// name.setTextAppearance(activity, R.style.TextAppearance_Medium);
// tag.setText(activity.getString(R.string.actfm_EPA_list, person.optString("tag")));
// //
// collaborators.addView(contact); }
// } }
// } }
// }); }
// }
public static class AssignedToUser { public static class AssignedToUser {
public String label; public String label;

@ -76,7 +76,7 @@ import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.abtesting.ABTestEventReportingService; import com.todoroo.astrid.service.abtesting.ABTestEventReportingService;
import com.todoroo.astrid.subtasks.SubtasksHelper; import com.todoroo.astrid.subtasks.SubtasksHelper;
import com.todoroo.astrid.sync.SyncV2Provider.SyncExceptionHandler; import com.todoroo.astrid.sync.SyncV2Provider.SyncExceptionHandler;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.tags.reusable.FeaturedListFilterExposer; import com.todoroo.astrid.tags.reusable.FeaturedListFilterExposer;
import com.todoroo.astrid.utility.Flags; import com.todoroo.astrid.utility.Flags;
@ -493,13 +493,13 @@ public final class ActFmSyncService {
Metadata metadata = new Metadata(); Metadata metadata = new Metadata();
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
metadata.readFromCursor(cursor); metadata.readFromCursor(cursor);
if(metadata.containsNonNullValue(TagMetadata.TAG_UUID) && if(metadata.containsNonNullValue(TaskToTagMetadata.TAG_UUID) &&
!RemoteModel.NO_UUID.equals(metadata.getValue(TagMetadata.TAG_UUID))) { !RemoteModel.NO_UUID.equals(metadata.getValue(TaskToTagMetadata.TAG_UUID))) {
params.add("tag_ids[]"); params.add("tag_ids[]");
params.add(metadata.getValue(TagMetadata.TAG_UUID)); params.add(metadata.getValue(TaskToTagMetadata.TAG_UUID));
} else { } else {
params.add("tags[]"); params.add("tags[]");
params.add(metadata.getValue(TagMetadata.TAG_NAME)); params.add(metadata.getValue(TaskToTagMetadata.TAG_NAME));
} }
} }
} }
@ -1014,7 +1014,7 @@ public final class ActFmSyncService {
JsonHelper.taskFromJson(result, task, metadata); JsonHelper.taskFromJson(result, task, metadata);
task.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true); task.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
taskService.save(task); taskService.save(task);
metadataService.synchronizeMetadata(task.getId(), metadata, Metadata.KEY.eq(TagMetadata.KEY), false); metadataService.synchronizeMetadata(task.getId(), metadata, Metadata.KEY.eq(TaskToTagMetadata.KEY), false);
synchronizeAttachments(result, task); synchronizeAttachments(result, task);
} }
@ -1524,7 +1524,7 @@ public final class ActFmSyncService {
} }
ids.add(remote.getId()); ids.add(remote.getId());
metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TagMetadata.KEY), false); metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TaskToTagMetadata.KEY), false);
synchronizeAttachments(item, remote); synchronizeAttachments(item, remote);
remote.clear(); remote.clear();
} }
@ -1847,7 +1847,7 @@ public final class ActFmSyncService {
String name = tag.getString("name"); String name = tag.getString("name");
if(TextUtils.isEmpty(name)) if(TextUtils.isEmpty(name))
continue; continue;
Metadata tagMetadata = TagMetadata.newTagMetadata(model.getId(), remoteId, name, tag.getString("id")); Metadata tagMetadata = TaskToTagMetadata.newTagMetadata(model.getId(), remoteId, name, tag.getString("id"));
metadata.add(tagMetadata); metadata.add(tagMetadata);
} }
} }

@ -42,7 +42,7 @@ import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.subtasks.SubtasksUpdater; import com.todoroo.astrid.subtasks.SubtasksUpdater;
import com.todoroo.astrid.sync.SyncResultCallback; import com.todoroo.astrid.sync.SyncResultCallback;
import com.todoroo.astrid.sync.SyncV2Provider; import com.todoroo.astrid.sync.SyncV2Provider;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.utility.Flags; import com.todoroo.astrid.utility.Flags;
@ -572,8 +572,8 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
private void pushQueuedTasksByTag(TagData tagData, SyncResultCallback callback, AtomicInteger finisher) { private void pushQueuedTasksByTag(TagData tagData, SyncResultCallback callback, AtomicInteger finisher) {
Long[] ids; Long[] ids;
TodorooCursor<Metadata> allTagged = metadataService.query(Query.select(Metadata.TASK).where(Criterion.and(Metadata.KEY.eq(TagMetadata.KEY), TodorooCursor<Metadata> allTagged = metadataService.query(Query.select(Metadata.TASK).where(Criterion.and(Metadata.KEY.eq(TaskToTagMetadata.KEY),
TagMetadata.TAG_NAME.eqCaseInsensitive(tagData.getValue(TagData.NAME))))); TaskToTagMetadata.TAG_NAME.eqCaseInsensitive(tagData.getValue(TagData.NAME)))));
try { try {
ids = new Long[allTagged.getCount()]; ids = new Long[allTagged.getCount()];
Metadata m = new Metadata(); Metadata m = new Metadata();
@ -588,8 +588,8 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
} }
TodorooCursor<Task> taskCursor = taskService.query(Query.select(Task.PROPERTIES) TodorooCursor<Task> taskCursor = taskService.query(Query.select(Task.PROPERTIES)
.join(Join.inner(Metadata.TABLE, Criterion.and(Metadata.KEY.eq(TagMetadata.KEY), Metadata.TASK.eq(Task.ID), .join(Join.inner(Metadata.TABLE, Criterion.and(Metadata.KEY.eq(TaskToTagMetadata.KEY), Metadata.TASK.eq(Task.ID),
TagMetadata.TAG_NAME.eqCaseInsensitive(tagData.getValue(TagData.NAME))))) TaskToTagMetadata.TAG_NAME.eqCaseInsensitive(tagData.getValue(TagData.NAME)))))
.where(Criterion.or( .where(Criterion.or(
Criterion.and(TaskCriteria.isActive(), Criterion.and(TaskCriteria.isActive(),
Task.REMOTE_ID.isNull()), Task.REMOTE_ID.isNull()),

@ -25,7 +25,7 @@ import com.todoroo.astrid.data.Update;
import com.todoroo.astrid.helper.UUIDHelper; import com.todoroo.astrid.helper.UUIDHelper;
import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TagDataService; import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
@SuppressWarnings("nls") @SuppressWarnings("nls")
@ -55,9 +55,9 @@ public class AstridNewSyncMigrator {
// First ensure that a TagData object exists for each tag metadata // First ensure that a TagData object exists for each tag metadata
// -------------- // --------------
Query noTagDataQuery = Query.select(Metadata.PROPERTIES).where(Criterion.and( Query noTagDataQuery = Query.select(Metadata.PROPERTIES).where(Criterion.and(
MetadataCriteria.withKey(TagMetadata.KEY), MetadataCriteria.withKey(TaskToTagMetadata.KEY),
Criterion.or(TagMetadata.TAG_UUID.isNull(), TagMetadata.TAG_UUID.eq(0)), Criterion.or(TaskToTagMetadata.TAG_UUID.isNull(), TaskToTagMetadata.TAG_UUID.eq(0)),
Criterion.not(TagMetadata.TAG_NAME.in(Query.select(TagData.NAME).from(TagData.TABLE))))).groupBy(TagMetadata.TAG_NAME); Criterion.not(TaskToTagMetadata.TAG_NAME.in(Query.select(TagData.NAME).from(TagData.TABLE))))).groupBy(TaskToTagMetadata.TAG_NAME);
TodorooCursor<Metadata> noTagData = metadataService.query(noTagDataQuery); TodorooCursor<Metadata> noTagData = metadataService.query(noTagDataQuery);
try { try {
@ -66,10 +66,10 @@ public class AstridNewSyncMigrator {
tag.readFromCursor(noTagData); tag.readFromCursor(noTagData);
if (Constants.DEBUG) if (Constants.DEBUG)
Log.w(LOG_TAG, "CREATING TAG DATA " + tag.getValue(TagMetadata.TAG_NAME)); Log.w(LOG_TAG, "CREATING TAG DATA " + tag.getValue(TaskToTagMetadata.TAG_NAME));
TagData newTagData = new TagData(); TagData newTagData = new TagData();
newTagData.setValue(TagData.NAME, tag.getValue(TagMetadata.TAG_NAME)); newTagData.setValue(TagData.NAME, tag.getValue(TaskToTagMetadata.TAG_NAME));
tagDataService.save(newTagData); tagDataService.save(newTagData);
} }
} finally { } finally {
@ -124,9 +124,9 @@ public class AstridNewSyncMigrator {
// Finally, ensure that all tag metadata entities have all important fields filled in // Finally, ensure that all tag metadata entities have all important fields filled in
// -------------- // --------------
Query incompleteQuery = Query.select(Metadata.PROPERTIES).where(Criterion.and( Query incompleteQuery = Query.select(Metadata.PROPERTIES).where(Criterion.and(
MetadataCriteria.withKey(TagMetadata.KEY), MetadataCriteria.withKey(TaskToTagMetadata.KEY),
Criterion.or(TagMetadata.TASK_UUID.eq(0), TagMetadata.TASK_UUID.isNull(), Criterion.or(TaskToTagMetadata.TASK_UUID.eq(0), TaskToTagMetadata.TASK_UUID.isNull(),
TagMetadata.TAG_UUID.eq(0), TagMetadata.TAG_UUID.isNull()))); TaskToTagMetadata.TAG_UUID.eq(0), TaskToTagMetadata.TAG_UUID.isNull())));
TodorooCursor<Metadata> incompleteMetadata = metadataService.query(incompleteQuery); TodorooCursor<Metadata> incompleteMetadata = metadataService.query(incompleteQuery);
try { try {
Metadata m = new Metadata(); Metadata m = new Metadata();
@ -136,16 +136,16 @@ public class AstridNewSyncMigrator {
boolean changes = false; boolean changes = false;
if (Constants.DEBUG) if (Constants.DEBUG)
Log.w(LOG_TAG, "Incomplete linking task " + m.getValue(Metadata.TASK) + " to " + m.getValue(TagMetadata.TAG_NAME)); Log.w(LOG_TAG, "Incomplete linking task " + m.getValue(Metadata.TASK) + " to " + m.getValue(TaskToTagMetadata.TAG_NAME));
if (!m.containsNonNullValue(TagMetadata.TASK_UUID) || RemoteModel.NO_UUID.equals(m.getValue(TagMetadata.TASK_UUID))) { if (!m.containsNonNullValue(TaskToTagMetadata.TASK_UUID) || RemoteModel.NO_UUID.equals(m.getValue(TaskToTagMetadata.TASK_UUID))) {
if (Constants.DEBUG) if (Constants.DEBUG)
Log.w(LOG_TAG, "No task uuid"); Log.w(LOG_TAG, "No task uuid");
updateTaskUuid(m); updateTaskUuid(m);
changes = true; changes = true;
} }
if (!m.containsNonNullValue(TagMetadata.TAG_UUID) || RemoteModel.NO_UUID.equals(m.getValue(TagMetadata.TAG_UUID))) { if (!m.containsNonNullValue(TaskToTagMetadata.TAG_UUID) || RemoteModel.NO_UUID.equals(m.getValue(TaskToTagMetadata.TAG_UUID))) {
if (Constants.DEBUG) if (Constants.DEBUG)
Log.w(LOG_TAG, "No tag uuid"); Log.w(LOG_TAG, "No tag uuid");
updateTagUuid(m); updateTagUuid(m);
@ -197,7 +197,7 @@ public class AstridNewSyncMigrator {
if (task != null) { if (task != null) {
if (Constants.DEBUG) if (Constants.DEBUG)
Log.w(LOG_TAG, "Linking with task uuid " + task.getValue(Task.UUID)); Log.w(LOG_TAG, "Linking with task uuid " + task.getValue(Task.UUID));
m.setValue(TagMetadata.TASK_UUID, task.getValue(Task.UUID)); m.setValue(TaskToTagMetadata.TASK_UUID, task.getValue(Task.UUID));
} else { } else {
if (Constants.DEBUG) if (Constants.DEBUG)
Log.w(LOG_TAG, "Task not found, deleting link"); Log.w(LOG_TAG, "Task not found, deleting link");
@ -206,12 +206,12 @@ public class AstridNewSyncMigrator {
} }
private void updateTagUuid(Metadata m) { private void updateTagUuid(Metadata m) {
String tag = m.getValue(TagMetadata.TAG_NAME); String tag = m.getValue(TaskToTagMetadata.TAG_NAME);
TagData tagData = tagDataService.getTag(tag, TagData.UUID); TagData tagData = tagDataService.getTag(tag, TagData.UUID);
if (tagData != null) { if (tagData != null) {
if (Constants.DEBUG) if (Constants.DEBUG)
Log.w(LOG_TAG, "Linking with tag uuid " + tagData.getValue(TagData.UUID)); Log.w(LOG_TAG, "Linking with tag uuid " + tagData.getValue(TagData.UUID));
m.setValue(TagMetadata.TAG_UUID, tagData.getValue(TagData.UUID)); m.setValue(TaskToTagMetadata.TAG_UUID, tagData.getValue(TagData.UUID));
} else { } else {
if (Constants.DEBUG) if (Constants.DEBUG)
Log.w(LOG_TAG, "Tag not found, deleting link"); Log.w(LOG_TAG, "Tag not found, deleting link");

@ -24,7 +24,7 @@ import com.todoroo.astrid.data.MetadataApiDao.MetadataCriteria;
import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
@SuppressWarnings("nls") @SuppressWarnings("nls")
@ -219,10 +219,10 @@ public class MakeChanges<TYPE extends RemoteModel> extends ServerToClientMessage
public void performChanges() { public void performChanges() {
if (changes.has("name")) { if (changes.has("name")) {
Metadata template = new Metadata(); Metadata template = new Metadata();
template.setValue(TagMetadata.TAG_NAME, changes.optString("name")); template.setValue(TaskToTagMetadata.TAG_NAME, changes.optString("name"));
PluginServices.getMetadataService().update( PluginServices.getMetadataService().update(
Criterion.and(MetadataCriteria.withKey(TagMetadata.KEY), Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY),
TagMetadata.TAG_UUID.eq(uuid)), template); TaskToTagMetadata.TAG_UUID.eq(uuid)), template);
} }
if (changes.has("member_added")) { if (changes.has("member_added")) {

@ -26,7 +26,7 @@ import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria; import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
/** /**
* Exposes Astrid's built in filters to the {@link FilterListFragment} * Exposes Astrid's built in filters to the {@link FilterListFragment}
@ -66,8 +66,8 @@ public final class CoreFilterExposer extends BroadcastReceiver implements Astrid
new QueryTemplate().where( new QueryTemplate().where(
Criterion.and(TaskCriteria.activeVisibleMine(), Criterion.and(TaskCriteria.activeVisibleMine(),
Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).where( Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).where(
Criterion.and(MetadataCriteria.withKey(TagMetadata.KEY), Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY),
TagMetadata.TAG_NAME.like("x_%", "x"))))))), //$NON-NLS-1$ //$NON-NLS-2$ TaskToTagMetadata.TAG_NAME.like("x_%", "x"))))))), //$NON-NLS-1$ //$NON-NLS-2$
null); null);
int themeFlags = ThemeService.getFilterThemeFlags(); int themeFlags = ThemeService.getFilterThemeFlags();
inbox.listingIcon = ((BitmapDrawable)r.getDrawable( inbox.listingIcon = ((BitmapDrawable)r.getDrawable(

@ -39,7 +39,7 @@ import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.User; import com.todoroo.astrid.data.User;
import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.AstridPreferences; import com.todoroo.astrid.utility.AstridPreferences;
public class PeopleFilterExposer extends BroadcastReceiver { public class PeopleFilterExposer extends BroadcastReceiver {
@ -141,8 +141,8 @@ public class PeopleFilterExposer extends BroadcastReceiver {
String title = context.getString(R.string.actfm_my_shared_tasks_title); String title = context.getString(R.string.actfm_my_shared_tasks_title);
QueryTemplate template = new QueryTemplate().join(Join.inner(Metadata.TABLE.as("mtags"), QueryTemplate template = new QueryTemplate().join(Join.inner(Metadata.TABLE.as("mtags"),
Criterion.and(Task.ID.eq(Field.field("mtags." + Metadata.TASK.name)), Criterion.and(Task.ID.eq(Field.field("mtags." + Metadata.TASK.name)),
Field.field("mtags." + Metadata.KEY.name).eq(TagMetadata.KEY), Field.field("mtags." + Metadata.KEY.name).eq(TaskToTagMetadata.KEY),
Field.field("mtags." + TagMetadata.TAG_NAME.name).in(names), Field.field("mtags." + TaskToTagMetadata.TAG_NAME.name).in(names),
TaskCriteria.activeVisibleMine()))); TaskCriteria.activeVisibleMine())));
FilterWithCustomIntent filter = new FilterWithCustomIntent(title, title, template, null); FilterWithCustomIntent filter = new FilterWithCustomIntent(title, title, template, null);

@ -35,7 +35,7 @@ import com.todoroo.astrid.notes.NoteMetadata;
import com.todoroo.astrid.producteev.ProducteevUtilities; import com.todoroo.astrid.producteev.ProducteevUtilities;
import com.todoroo.astrid.producteev.api.ApiUtilities; import com.todoroo.astrid.producteev.api.ApiUtilities;
import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
public final class ProducteevDataService { public final class ProducteevDataService {
@ -157,7 +157,7 @@ public final class ProducteevDataService {
// note we don't include note metadata, since we only receive deltas // note we don't include note metadata, since we only receive deltas
metadataService.synchronizeMetadata(task.task.getId(), task.metadata, metadataService.synchronizeMetadata(task.task.getId(), task.metadata,
Criterion.or(MetadataCriteria.withKey(ProducteevTask.METADATA_KEY), Criterion.or(MetadataCriteria.withKey(ProducteevTask.METADATA_KEY),
MetadataCriteria.withKey(TagMetadata.KEY)), true); MetadataCriteria.withKey(TaskToTagMetadata.KEY)), true);
} }
/** /**
@ -172,7 +172,7 @@ public final class ProducteevDataService {
ArrayList<Metadata> metadata = new ArrayList<Metadata>(); ArrayList<Metadata> metadata = new ArrayList<Metadata>();
TodorooCursor<Metadata> metadataCursor = metadataService.query(Query.select(Metadata.PROPERTIES). TodorooCursor<Metadata> metadataCursor = metadataService.query(Query.select(Metadata.PROPERTIES).
where(Criterion.and(MetadataCriteria.byTask(task.getId()), where(Criterion.and(MetadataCriteria.byTask(task.getId()),
Criterion.or(MetadataCriteria.withKey(TagMetadata.KEY), Criterion.or(MetadataCriteria.withKey(TaskToTagMetadata.KEY),
MetadataCriteria.withKey(ProducteevTask.METADATA_KEY), MetadataCriteria.withKey(ProducteevTask.METADATA_KEY),
MetadataCriteria.withKey(NoteMetadata.METADATA_KEY))))); MetadataCriteria.withKey(NoteMetadata.METADATA_KEY)))));
try { try {

@ -57,7 +57,7 @@ import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.sync.SyncContainer; import com.todoroo.astrid.sync.SyncContainer;
import com.todoroo.astrid.sync.SyncProvider; import com.todoroo.astrid.sync.SyncProvider;
import com.todoroo.astrid.sync.SyncProviderUtilities; import com.todoroo.astrid.sync.SyncProviderUtilities;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
@SuppressWarnings("nls") @SuppressWarnings("nls")
@ -394,8 +394,8 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
continue; continue;
Metadata tagData = new Metadata(); Metadata tagData = new Metadata();
tagData.setValue(Metadata.KEY, TagMetadata.KEY); tagData.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
tagData.setValue(TagMetadata.TAG_NAME, ApiUtilities.decode(label.getString("title"))); tagData.setValue(TaskToTagMetadata.TAG_NAME, ApiUtilities.decode(label.getString("title")));
metadata.add(tagData); metadata.add(tagData);
} }
@ -572,12 +572,12 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
HashSet<String> localTags = new HashSet<String>(); HashSet<String> localTags = new HashSet<String>();
HashSet<String> remoteTags = new HashSet<String>(); HashSet<String> remoteTags = new HashSet<String>();
for(Metadata item : local.metadata) for(Metadata item : local.metadata)
if(TagMetadata.KEY.equals(item.getValue(Metadata.KEY))) if(TaskToTagMetadata.KEY.equals(item.getValue(Metadata.KEY)))
localTags.add(item.getValue(TagMetadata.TAG_NAME)); localTags.add(item.getValue(TaskToTagMetadata.TAG_NAME));
if(remote != null && remote.metadata != null) { if(remote != null && remote.metadata != null) {
for(Metadata item : remote.metadata) for(Metadata item : remote.metadata)
if(TagMetadata.KEY.equals(item.getValue(Metadata.KEY))) if(TaskToTagMetadata.KEY.equals(item.getValue(Metadata.KEY)))
remoteTags.add(item.getValue(TagMetadata.TAG_NAME)); remoteTags.add(item.getValue(TaskToTagMetadata.TAG_NAME));
} }
if(!localTags.equals(remoteTags)) { if(!localTags.equals(remoteTags)) {

@ -111,7 +111,7 @@ public class TagCaseMigrator {
@Deprecated @Deprecated
private static Criterion tagEq(String tag, Criterion additionalCriterion) { private static Criterion tagEq(String tag, Criterion additionalCriterion) {
return Criterion.and( return Criterion.and(
MetadataCriteria.withKey(TagMetadata.KEY), TagMetadata.TAG_NAME.eq(tag), MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_NAME.eq(tag),
additionalCriterion); additionalCriterion);
} }
@ -121,14 +121,14 @@ public class TagCaseMigrator {
try { try {
for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) { for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) {
Task curr = new Task(tasks); Task curr = new Task(tasks);
TodorooCursor<Metadata> tagMetadata = metadataService.query(Query.select(TagMetadata.TAG_NAME) TodorooCursor<Metadata> tagMetadata = metadataService.query(Query.select(TaskToTagMetadata.TAG_NAME)
.where(Criterion.and(TagMetadata.TAG_NAME.eq(target), Metadata.KEY.eq(TagMetadata.KEY), Metadata.TASK.eq(curr.getId())))); .where(Criterion.and(TaskToTagMetadata.TAG_NAME.eq(target), Metadata.KEY.eq(TaskToTagMetadata.KEY), Metadata.TASK.eq(curr.getId()))));
try { try {
if (tagMetadata.getCount() == 0) { if (tagMetadata.getCount() == 0) {
Metadata newTag = new Metadata(); Metadata newTag = new Metadata();
newTag.setValue(Metadata.KEY, TagMetadata.KEY); newTag.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
newTag.setValue(Metadata.TASK, curr.getId()); newTag.setValue(Metadata.TASK, curr.getId());
newTag.setValue(TagMetadata.TAG_NAME, target); newTag.setValue(TaskToTagMetadata.TAG_NAME, target);
metadataService.save(newTag); metadataService.save(newTag);
} // else already exists for some weird reason } // else already exists for some weird reason
} finally { } finally {

@ -46,16 +46,16 @@ public class TagCustomFilterCriteriaExposer extends BroadcastReceiver {
for(int i = 0; i < tags.length; i++) for(int i = 0; i < tags.length; i++)
tagNames[i] = tags[i].tag; tagNames[i] = tags[i].tag;
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
values.put(Metadata.KEY.name, TagMetadata.KEY); values.put(Metadata.KEY.name, TaskToTagMetadata.KEY);
values.put(TagMetadata.TAG_NAME.name, "?"); values.put(TaskToTagMetadata.TAG_NAME.name, "?");
CustomFilterCriterion criterion = new MultipleSelectCriterion( CustomFilterCriterion criterion = new MultipleSelectCriterion(
IDENTIFIER_TAG_IS, IDENTIFIER_TAG_IS,
context.getString(R.string.CFC_tag_text), context.getString(R.string.CFC_tag_text),
Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner( Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner(
Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and( Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and(
TaskDao.TaskCriteria.activeAndVisible(), TaskDao.TaskCriteria.activeAndVisible(),
MetadataDao.MetadataCriteria.withKey(TagMetadata.KEY), MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY),
TagMetadata.TAG_NAME.eq("?"))).toString(), TaskToTagMetadata.TAG_NAME.eq("?"))).toString(),
values, tagNames, tagNames, values, tagNames, tagNames,
((BitmapDrawable)r.getDrawable(TagService.getDefaultImageIDForTag(RemoteModel.NO_UUID))).getBitmap(), ((BitmapDrawable)r.getDrawable(TagService.getDefaultImageIDForTag(RemoteModel.NO_UUID))).getBitmap(),
context.getString(R.string.CFC_tag_name)); context.getString(R.string.CFC_tag_name));
@ -70,8 +70,8 @@ public class TagCustomFilterCriteriaExposer extends BroadcastReceiver {
Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner( Query.select(Metadata.TASK).from(Metadata.TABLE).join(Join.inner(
Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and( Task.TABLE, Metadata.TASK.eq(Task.ID))).where(Criterion.and(
TaskDao.TaskCriteria.activeAndVisible(), TaskDao.TaskCriteria.activeAndVisible(),
MetadataDao.MetadataCriteria.withKey(TagMetadata.KEY), MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY),
TagMetadata.TAG_NAME.like("%?%"))).toString(), TaskToTagMetadata.TAG_NAME.like("%?%"))).toString(),
null, context.getString(R.string.CFC_tag_contains_name), "", null, context.getString(R.string.CFC_tag_contains_name), "",
((BitmapDrawable)r.getDrawable(TagService.getDefaultImageIDForTag(RemoteModel.NO_UUID))).getBitmap(), ((BitmapDrawable)r.getDrawable(TagService.getDefaultImageIDForTag(RemoteModel.NO_UUID))).getBitmap(),
context.getString(R.string.CFC_tag_contains_name)); context.getString(R.string.CFC_tag_contains_name));

@ -72,9 +72,9 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE
return null; return null;
QueryTemplate tagTemplate = tag.queryTemplate(criterion); QueryTemplate tagTemplate = tag.queryTemplate(criterion);
ContentValues contentValues = new ContentValues(); ContentValues contentValues = new ContentValues();
contentValues.put(Metadata.KEY.name, TagMetadata.KEY); contentValues.put(Metadata.KEY.name, TaskToTagMetadata.KEY);
contentValues.put(TagMetadata.TAG_NAME.name, tag.tag); contentValues.put(TaskToTagMetadata.TAG_NAME.name, tag.tag);
contentValues.put(TagMetadata.TAG_UUID.name, tag.uuid.toString()); contentValues.put(TaskToTagMetadata.TAG_UUID.name, tag.uuid.toString());
FilterWithUpdate filter = new FilterWithUpdate(tag.tag, FilterWithUpdate filter = new FilterWithUpdate(tag.tag,
title, tagTemplate, title, tagTemplate,

@ -0,0 +1,12 @@
package com.todoroo.astrid.tags;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.astrid.data.TagMetadata;
public class TagMemberMetadata {
public static final String KEY = "tag-members"; //$NON-NLS-1$
public static final StringProperty USER_UUID = new StringProperty(
TagMetadata.TABLE, TagMetadata.VALUE1.name);
}

@ -93,7 +93,7 @@ public final class TagService {
* Property for retrieving count of aggregated rows * Property for retrieving count of aggregated rows
*/ */
private static final CountProperty COUNT = new CountProperty(); private static final CountProperty COUNT = new CountProperty();
public static final Order GROUPED_TAGS_BY_ALPHA = Order.asc(Functions.upper(TagMetadata.TAG_NAME)); public static final Order GROUPED_TAGS_BY_ALPHA = Order.asc(Functions.upper(TaskToTagMetadata.TAG_NAME));
public static final Order GROUPED_TAGS_BY_SIZE = Order.desc(COUNT); public static final Order GROUPED_TAGS_BY_SIZE = Order.desc(COUNT);
/** /**
@ -152,11 +152,11 @@ public final class TagService {
*/ */
public QueryTemplate queryTemplate(Criterion criterion) { public QueryTemplate queryTemplate(Criterion criterion) {
Criterion fullCriterion = Criterion.and( Criterion fullCriterion = Criterion.and(
Field.field("mtags." + Metadata.KEY.name).eq(TagMetadata.KEY), Field.field("mtags." + Metadata.KEY.name).eq(TaskToTagMetadata.KEY),
Field.field("mtags." + TagMetadata.TAG_UUID.name).eq(uuid), Field.field("mtags." + TaskToTagMetadata.TAG_UUID.name).eq(uuid),
Field.field("mtags." + Metadata.DELETION_DATE.name).eq(0), Field.field("mtags." + Metadata.DELETION_DATE.name).eq(0),
criterion); criterion);
return new QueryTemplate().join(Join.inner(Metadata.TABLE.as("mtags"), Task.UUID.eq(Field.field("mtags." + TagMetadata.TASK_UUID.name)))) return new QueryTemplate().join(Join.inner(Metadata.TABLE.as("mtags"), Task.UUID.eq(Field.field("mtags." + TaskToTagMetadata.TASK_UUID.name))))
.where(fullCriterion); .where(fullCriterion);
} }
@ -165,13 +165,13 @@ public final class TagService {
@Deprecated @Deprecated
private static Criterion tagEq(String tag, Criterion additionalCriterion) { private static Criterion tagEq(String tag, Criterion additionalCriterion) {
return Criterion.and( return Criterion.and(
MetadataCriteria.withKey(TagMetadata.KEY), TagMetadata.TAG_NAME.eq(tag), MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_NAME.eq(tag),
additionalCriterion); additionalCriterion);
} }
public static Criterion tagEqIgnoreCase(String tag, Criterion additionalCriterion) { public static Criterion tagEqIgnoreCase(String tag, Criterion additionalCriterion) {
return Criterion.and( return Criterion.and(
MetadataCriteria.withKey(TagMetadata.KEY), TagMetadata.TAG_NAME.eqCaseInsensitive(tag), MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_NAME.eqCaseInsensitive(tag),
additionalCriterion); additionalCriterion);
} }
@ -179,8 +179,8 @@ public final class TagService {
String[] emergentTags = getEmergentTagIds(); String[] emergentTags = getEmergentTagIds();
return new QueryTemplate().where(Criterion.and( return new QueryTemplate().where(Criterion.and(
Criterion.not(Task.UUID.in(Query.select(TagMetadata.TASK_UUID).from(Metadata.TABLE) Criterion.not(Task.UUID.in(Query.select(TaskToTagMetadata.TASK_UUID).from(Metadata.TABLE)
.where(Criterion.and(MetadataCriteria.withKey(TagMetadata.KEY), Metadata.DELETION_DATE.eq(0), Criterion.not(TagMetadata.TAG_UUID.in(emergentTags)))))), .where(Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY), Metadata.DELETION_DATE.eq(0), Criterion.not(TaskToTagMetadata.TAG_UUID.in(emergentTags)))))),
TaskCriteria.isActive(), TaskCriteria.isActive(),
TaskApiDao.TaskCriteria.ownedByMe(), TaskApiDao.TaskCriteria.ownedByMe(),
TaskCriteria.isVisible())); TaskCriteria.isVisible()));
@ -197,19 +197,19 @@ public final class TagService {
public Tag[] getGroupedTags(Order order, Criterion activeStatus, boolean includeEmergent) { public Tag[] getGroupedTags(Order order, Criterion activeStatus, boolean includeEmergent) {
Criterion criterion; Criterion criterion;
if (includeEmergent) if (includeEmergent)
criterion = Criterion.and(activeStatus, MetadataCriteria.withKey(TagMetadata.KEY)); criterion = Criterion.and(activeStatus, MetadataCriteria.withKey(TaskToTagMetadata.KEY));
else else
criterion = Criterion.and(activeStatus, MetadataCriteria.withKey(TagMetadata.KEY), Criterion.not(TagMetadata.TAG_UUID.in(getEmergentTagIds()))); criterion = Criterion.and(activeStatus, MetadataCriteria.withKey(TaskToTagMetadata.KEY), Criterion.not(TaskToTagMetadata.TAG_UUID.in(getEmergentTagIds())));
Query query = Query.select(TagMetadata.TAG_NAME, TagMetadata.TAG_UUID, COUNT). Query query = Query.select(TaskToTagMetadata.TAG_NAME, TaskToTagMetadata.TAG_UUID, COUNT).
join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))).
where(criterion). where(criterion).
orderBy(order).groupBy(TagMetadata.TAG_NAME); orderBy(order).groupBy(TaskToTagMetadata.TAG_NAME);
TodorooCursor<Metadata> cursor = metadataDao.query(query); TodorooCursor<Metadata> cursor = metadataDao.query(query);
try { try {
ArrayList<Tag> array = new ArrayList<Tag>(); ArrayList<Tag> array = new ArrayList<Tag>();
for (int i = 0; i < cursor.getCount(); i++) { for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToNext(); cursor.moveToNext();
Tag tag = Tag.tagFromUUID(cursor.get(TagMetadata.TAG_UUID)); Tag tag = Tag.tagFromUUID(cursor.get(TaskToTagMetadata.TAG_UUID));
if (tag != null) if (tag != null)
array.add(tag); array.add(tag);
} }
@ -258,9 +258,9 @@ public final class TagService {
} }
public void createLink(Task task, String tagName, String tagUuid) { public void createLink(Task task, String tagName, String tagUuid) {
Metadata link = TagMetadata.newTagMetadata(task.getId(), task.getUuid(), tagName, tagUuid); Metadata link = TaskToTagMetadata.newTagMetadata(task.getId(), task.getUuid(), tagName, tagUuid);
if (metadataDao.update(Criterion.and(MetadataCriteria.byTaskAndwithKey(task.getId(), TagMetadata.KEY), if (metadataDao.update(Criterion.and(MetadataCriteria.byTaskAndwithKey(task.getId(), TaskToTagMetadata.KEY),
TagMetadata.TASK_UUID.eq(task.getValue(Task.UUID)), TagMetadata.TAG_UUID.eq(tagUuid)), link) <= 0) { TaskToTagMetadata.TASK_UUID.eq(task.getValue(Task.UUID)), TaskToTagMetadata.TAG_UUID.eq(tagUuid)), link) <= 0) {
metadataDao.createNew(link); metadataDao.createNew(link);
} }
} }
@ -282,11 +282,11 @@ public final class TagService {
name = tagData.getValue(TagData.NAME); name = tagData.getValue(TagData.NAME);
} }
Metadata link = TagMetadata.newTagMetadata(taskId, taskUuid, name, tagUuid); Metadata link = TaskToTagMetadata.newTagMetadata(taskId, taskUuid, name, tagUuid);
if (suppressOutstanding) if (suppressOutstanding)
link.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true); link.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
if (metadataDao.update(Criterion.and(MetadataCriteria.byTaskAndwithKey(taskId, TagMetadata.KEY), if (metadataDao.update(Criterion.and(MetadataCriteria.byTaskAndwithKey(taskId, TaskToTagMetadata.KEY),
TagMetadata.TASK_UUID.eq(taskUuid), TagMetadata.TAG_UUID.eq(tagUuid)), link) <= 0) { TaskToTagMetadata.TASK_UUID.eq(taskUuid), TaskToTagMetadata.TAG_UUID.eq(tagUuid)), link) <= 0) {
if (suppressOutstanding) if (suppressOutstanding)
link.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true); link.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
metadataDao.createNew(link); metadataDao.createNew(link);
@ -307,10 +307,10 @@ public final class TagService {
if (suppressOutstanding) if (suppressOutstanding)
deleteTemplate.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true); deleteTemplate.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
deleteTemplate.setValue(Metadata.TASK, taskId); // Need this for recording changes in outstanding table deleteTemplate.setValue(Metadata.TASK, taskId); // Need this for recording changes in outstanding table
deleteTemplate.setValue(TagMetadata.TAG_UUID, tagUuid); // Need this for recording changes in outstanding table deleteTemplate.setValue(TaskToTagMetadata.TAG_UUID, tagUuid); // Need this for recording changes in outstanding table
deleteTemplate.setValue(Metadata.DELETION_DATE, DateUtilities.now()); deleteTemplate.setValue(Metadata.DELETION_DATE, DateUtilities.now());
metadataDao.update(Criterion.and(MetadataCriteria.withKey(TagMetadata.KEY), Metadata.DELETION_DATE.eq(0), metadataDao.update(Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY), Metadata.DELETION_DATE.eq(0),
TagMetadata.TASK_UUID.eq(taskUuid), TagMetadata.TAG_UUID.eq(tagUuid)), deleteTemplate); TaskToTagMetadata.TASK_UUID.eq(taskUuid), TaskToTagMetadata.TAG_UUID.eq(tagUuid)), deleteTemplate);
} }
/** /**
@ -326,11 +326,11 @@ public final class TagService {
for (String uuid : tagUuids) { for (String uuid : tagUuids) {
// 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(TagMetadata.TAG_UUID, uuid); // Need this for recording changes in outstanding table deleteTemplate.setValue(TaskToTagMetadata.TAG_UUID, uuid); // Need this for recording changes in outstanding table
if (suppressOutstanding) if (suppressOutstanding)
deleteTemplate.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true); deleteTemplate.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true);
metadataDao.update(Criterion.and(MetadataCriteria.withKey(TagMetadata.KEY), Metadata.DELETION_DATE.eq(0), metadataDao.update(Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY), Metadata.DELETION_DATE.eq(0),
TagMetadata.TASK_UUID.eq(taskUuid), TagMetadata.TAG_UUID.eq(uuid)), deleteTemplate); TaskToTagMetadata.TASK_UUID.eq(taskUuid), TaskToTagMetadata.TAG_UUID.eq(uuid)), deleteTemplate);
} }
} }
} }
@ -344,21 +344,21 @@ public final class TagService {
public TodorooCursor<Metadata> getTags(long taskId, boolean includeEmergent) { public TodorooCursor<Metadata> getTags(long taskId, boolean includeEmergent) {
Criterion criterion; Criterion criterion;
if (includeEmergent) if (includeEmergent)
criterion = Criterion.and(MetadataCriteria.withKey(TagMetadata.KEY), criterion = Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY),
Metadata.DELETION_DATE.eq(0), Metadata.DELETION_DATE.eq(0),
MetadataCriteria.byTask(taskId)); MetadataCriteria.byTask(taskId));
else else
criterion = Criterion.and(MetadataCriteria.withKey(TagMetadata.KEY), criterion = Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY),
Metadata.DELETION_DATE.eq(0), Metadata.DELETION_DATE.eq(0),
MetadataCriteria.byTask(taskId), Criterion.not(TagMetadata.TAG_UUID.in(getEmergentTagIds()))); MetadataCriteria.byTask(taskId), Criterion.not(TaskToTagMetadata.TAG_UUID.in(getEmergentTagIds())));
Query query = Query.select(TagMetadata.TAG_NAME, TagMetadata.TAG_UUID).where(criterion).orderBy(Order.asc(Functions.upper(TagMetadata.TAG_NAME))); Query query = Query.select(TaskToTagMetadata.TAG_NAME, TaskToTagMetadata.TAG_UUID).where(criterion).orderBy(Order.asc(Functions.upper(TaskToTagMetadata.TAG_NAME)));
return metadataDao.query(query); return metadataDao.query(query);
} }
public TodorooCursor<TagData> getTagDataForTask(long taskId, boolean includeEmergent, Property<?>... properties) { public TodorooCursor<TagData> getTagDataForTask(long taskId, boolean includeEmergent, Property<?>... properties) {
Criterion criterion = TagData.UUID.in(Query.select(TagMetadata.TAG_UUID) Criterion criterion = TagData.UUID.in(Query.select(TaskToTagMetadata.TAG_UUID)
.from(Metadata.TABLE) .from(Metadata.TABLE)
.where(Criterion.and(MetadataCriteria.withKey(TagMetadata.KEY), .where(Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY),
Metadata.DELETION_DATE.eq(0), Metadata.DELETION_DATE.eq(0),
Metadata.TASK.eq(taskId)))); Metadata.TASK.eq(taskId))));
if (!includeEmergent) if (!includeEmergent)
@ -368,9 +368,9 @@ public final class TagService {
} }
public TodorooCursor<TagData> getTagDataForTask(long taskId, Criterion additionalCriterion, Property<?>... properties) { public TodorooCursor<TagData> getTagDataForTask(long taskId, Criterion additionalCriterion, Property<?>... properties) {
Criterion criterion = TagData.UUID.in(Query.select(TagMetadata.TAG_UUID).from(Metadata.TABLE).where( Criterion criterion = TagData.UUID.in(Query.select(TaskToTagMetadata.TAG_UUID).from(Metadata.TABLE).where(
Criterion.and(Metadata.DELETION_DATE.eq(0), Criterion.and(Metadata.DELETION_DATE.eq(0),
MetadataCriteria.byTaskAndwithKey(taskId, TagMetadata.KEY)))); MetadataCriteria.byTaskAndwithKey(taskId, TaskToTagMetadata.KEY))));
return tagDataService.query(Query.select(properties).where(Criterion.and(criterion, additionalCriterion))); return tagDataService.query(Query.select(properties).where(Criterion.and(criterion, additionalCriterion)));
} }
@ -399,7 +399,7 @@ public final class TagService {
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
tags.moveToNext(); tags.moveToNext();
metadata.readFromCursor(tags); metadata.readFromCursor(tags);
tagBuilder.append(metadata.getValue(TagMetadata.TAG_NAME)); tagBuilder.append(metadata.getValue(TaskToTagMetadata.TAG_NAME));
if (i < length - 1) if (i < length - 1)
tagBuilder.append(separator); tagBuilder.append(separator);
} }
@ -492,11 +492,11 @@ public final class TagService {
public boolean synchronizeTags(long taskId, String taskUuid, Set<String> tags) { public boolean synchronizeTags(long taskId, String taskUuid, Set<String> tags) {
HashSet<String> existingLinks = new HashSet<String>(); HashSet<String> existingLinks = new HashSet<String>();
TodorooCursor<Metadata> links = metadataDao.query(Query.select(Metadata.PROPERTIES) TodorooCursor<Metadata> links = metadataDao.query(Query.select(Metadata.PROPERTIES)
.where(Criterion.and(TagMetadata.TASK_UUID.eq(taskUuid), Metadata.DELETION_DATE.eq(0)))); .where(Criterion.and(TaskToTagMetadata.TASK_UUID.eq(taskUuid), Metadata.DELETION_DATE.eq(0))));
try { try {
for (links.moveToFirst(); !links.isAfterLast(); links.moveToNext()) { for (links.moveToFirst(); !links.isAfterLast(); links.moveToNext()) {
Metadata link = new Metadata(links); Metadata link = new Metadata(links);
existingLinks.add(link.getValue(TagMetadata.TAG_UUID)); existingLinks.add(link.getValue(TaskToTagMetadata.TAG_UUID));
} }
} finally { } finally {
links.close(); links.close();
@ -512,7 +512,7 @@ public final class TagService {
if (existingLinks.contains(tagData.getValue(TagData.UUID))) { if (existingLinks.contains(tagData.getValue(TagData.UUID))) {
existingLinks.remove(tagData.getValue(TagData.UUID)); existingLinks.remove(tagData.getValue(TagData.UUID));
} else { } else {
Metadata newLink = TagMetadata.newTagMetadata(taskId, taskUuid, tag, tagData.getValue(TagData.UUID)); Metadata newLink = TaskToTagMetadata.newTagMetadata(taskId, taskUuid, tag, tagData.getValue(TagData.UUID));
metadataDao.createNew(newLink); metadataDao.createNew(newLink);
} }
} }
@ -532,12 +532,12 @@ public final class TagService {
public String getTagWithCase(String tag) { public String getTagWithCase(String tag) {
MetadataService service = PluginServices.getMetadataService(); MetadataService service = PluginServices.getMetadataService();
String tagWithCase = tag; String tagWithCase = tag;
TodorooCursor<Metadata> tagMetadata = service.query(Query.select(TagMetadata.TAG_NAME).where(TagService.tagEqIgnoreCase(tag, Criterion.all)).limit(1)); TodorooCursor<Metadata> tagMetadata = service.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();
Metadata tagMatch = new Metadata(tagMetadata); Metadata tagMatch = new Metadata(tagMetadata);
tagWithCase = tagMatch.getValue(TagMetadata.TAG_NAME); tagWithCase = tagMatch.getValue(TaskToTagMetadata.TAG_NAME);
} else { } else {
TodorooCursor<TagData> tagData = tagDataService.query(Query.select(TagData.NAME).where(TagData.NAME.eqCaseInsensitive(tag))); TodorooCursor<TagData> tagData = tagDataService.query(Query.select(TagData.NAME).where(TagData.NAME.eqCaseInsensitive(tag)));
try { try {
@ -595,7 +595,7 @@ public final class TagService {
// Then rename all instances of oldTag to newTag. // Then rename all instances of oldTag to newTag.
Metadata metadata = new Metadata(); Metadata metadata = new Metadata();
metadata.setValue(TagMetadata.TAG_NAME, newTag); metadata.setValue(TaskToTagMetadata.TAG_NAME, newTag);
int ret; int ret;
if (caseSensitive) if (caseSensitive)
ret = metadataService.update(tagEq(oldTag, Criterion.all), metadata); ret = metadataService.update(tagEq(oldTag, Criterion.all), metadata);

@ -232,7 +232,7 @@ public final class TagsControlSet extends PopupControlSet {
LinkedHashSet<String> tags = new LinkedHashSet<String>(cursor.getCount()); LinkedHashSet<String> tags = new LinkedHashSet<String>(cursor.getCount());
try { try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String tag = cursor.get(TagMetadata.TAG_NAME); String tag = cursor.get(TaskToTagMetadata.TAG_NAME);
tags.add(tag); tags.add(tag);
} }
} finally { } finally {

@ -3,7 +3,7 @@ package com.todoroo.astrid.tags;
import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
public class TagMetadata { public class TaskToTagMetadata {
/** Metadata key for tag data */ /** Metadata key for tag data */
public static final String KEY = "tags-tag"; //$NON-NLS-1$ public static final String KEY = "tags-tag"; //$NON-NLS-1$

@ -26,7 +26,7 @@ import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria; import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
import com.todoroo.astrid.tags.TagFilterExposer; import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.tags.TagService.Tag; import com.todoroo.astrid.tags.TagService.Tag;
@ -48,9 +48,9 @@ public class FeaturedListFilterExposer extends TagFilterExposer {
String title = tag.tag; String title = tag.tag;
QueryTemplate tagTemplate = tag.queryTemplate(criterion); QueryTemplate tagTemplate = tag.queryTemplate(criterion);
ContentValues contentValues = new ContentValues(); ContentValues contentValues = new ContentValues();
contentValues.put(Metadata.KEY.name, TagMetadata.KEY); contentValues.put(Metadata.KEY.name, TaskToTagMetadata.KEY);
contentValues.put(TagMetadata.TAG_NAME.name, tag.tag); contentValues.put(TaskToTagMetadata.TAG_NAME.name, tag.tag);
contentValues.put(TagMetadata.TAG_UUID.name, tag.uuid.toString()); contentValues.put(TaskToTagMetadata.TAG_UUID.name, tag.uuid.toString());
FilterWithUpdate filter = new FilterWithUpdate(tag.tag, FilterWithUpdate filter = new FilterWithUpdate(tag.tag,
title, tagTemplate, title, tagTemplate,

@ -101,7 +101,7 @@ import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.service.UpgradeService; import com.todoroo.astrid.service.UpgradeService;
import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.sync.SyncProviderPreferences; import com.todoroo.astrid.sync.SyncProviderPreferences;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.taskrabbit.TaskRabbitMetadata; import com.todoroo.astrid.taskrabbit.TaskRabbitMetadata;
import com.todoroo.astrid.timers.TimerPlugin; import com.todoroo.astrid.timers.TimerPlugin;
@ -951,15 +951,15 @@ public class TaskListFragment extends ListFragment implements OnScrollListener,
tagName = getActiveTagData().getValue(TagData.NAME); tagName = getActiveTagData().getValue(TagData.NAME);
String[] emergentTagIds = TagService.getInstance().getEmergentTagIds(); String[] emergentTagIds = TagService.getInstance().getEmergentTagIds();
StringProperty tagProperty = new StringProperty(null, TAGS_METADATA_JOIN + "." + TagMetadata.TAG_UUID.name); StringProperty tagProperty = new StringProperty(null, TAGS_METADATA_JOIN + "." + TaskToTagMetadata.TAG_UUID.name);
Criterion tagsJoinCriterion = Criterion.and( Criterion tagsJoinCriterion = Criterion.and(
Field.field(TAGS_METADATA_JOIN + "." + Metadata.KEY.name).eq(TagMetadata.KEY), //$NON-NLS-1$ Field.field(TAGS_METADATA_JOIN + "." + Metadata.KEY.name).eq(TaskToTagMetadata.KEY), //$NON-NLS-1$
Field.field(TAGS_METADATA_JOIN + "." + Metadata.DELETION_DATE.name).eq(0), Field.field(TAGS_METADATA_JOIN + "." + Metadata.DELETION_DATE.name).eq(0),
Task.ID.eq(Field.field(TAGS_METADATA_JOIN + "." + Metadata.TASK.name)), Task.ID.eq(Field.field(TAGS_METADATA_JOIN + "." + Metadata.TASK.name)),
Criterion.not(tagProperty.in(emergentTagIds))); Criterion.not(tagProperty.in(emergentTagIds)));
if (tagName != null) if (tagName != null)
tagsJoinCriterion = Criterion.and(tagsJoinCriterion, Field.field(TAGS_METADATA_JOIN + "." + TagMetadata.TAG_NAME.name).neq(tagName)); tagsJoinCriterion = Criterion.and(tagsJoinCriterion, Field.field(TAGS_METADATA_JOIN + "." + TaskToTagMetadata.TAG_NAME.name).neq(tagName));
// TODO: For now, we'll modify the query to join and include the task rabbit and tag data here. // TODO: For now, we'll modify the query to join and include the task rabbit and tag data here.
// Eventually, we might consider restructuring things so that this query is constructed elsewhere. // Eventually, we might consider restructuring things so that this query is constructed elsewhere.

@ -91,7 +91,7 @@ import com.todoroo.astrid.notes.NotesAction;
import com.todoroo.astrid.notes.NotesDecorationExposer; import com.todoroo.astrid.notes.NotesDecorationExposer;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.ThemeService; import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.timers.TimerDecorationExposer; import com.todoroo.astrid.timers.TimerDecorationExposer;
import com.todoroo.astrid.ui.CheckableImageView; import com.todoroo.astrid.ui.CheckableImageView;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
@ -116,7 +116,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
Metadata.ID.name).as("taskRabId"); //$NON-NLS-1$ Metadata.ID.name).as("taskRabId"); //$NON-NLS-1$
@SuppressWarnings("nls") @SuppressWarnings("nls")
private static final StringProperty TAGS = new StringProperty(null, "group_concat(" + TaskListFragment.TAGS_METADATA_JOIN + "." + TagMetadata.TAG_NAME.name + ", ' | ')").as("tags"); private static final StringProperty TAGS = new StringProperty(null, "group_concat(" + TaskListFragment.TAGS_METADATA_JOIN + "." + TaskToTagMetadata.TAG_NAME.name + ", ' | ')").as("tags");
// --- other constants // --- other constants

@ -18,6 +18,7 @@ import com.todoroo.astrid.data.ABTestEvent;
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.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.TagMetadata;
import com.todoroo.astrid.data.TagOutstanding; import com.todoroo.astrid.data.TagOutstanding;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskOutstanding; import com.todoroo.astrid.data.TaskOutstanding;
@ -61,6 +62,7 @@ public class Database extends AbstractDatabase {
Update.TABLE, Update.TABLE,
User.TABLE, User.TABLE,
ABTestEvent.TABLE, ABTestEvent.TABLE,
TagMetadata.TABLE,
TaskOutstanding.TABLE, TaskOutstanding.TABLE,
TagOutstanding.TABLE, TagOutstanding.TABLE,
@ -358,6 +360,7 @@ public class Database extends AbstractDatabase {
case 28: try { case 28: try {
database.execSQL(createTableSql(visitor, TaskOutstanding.TABLE.name, TaskOutstanding.PROPERTIES)); database.execSQL(createTableSql(visitor, TaskOutstanding.TABLE.name, TaskOutstanding.PROPERTIES));
database.execSQL(createTableSql(visitor, TagOutstanding.TABLE.name, TagOutstanding.PROPERTIES)); database.execSQL(createTableSql(visitor, TagOutstanding.TABLE.name, TagOutstanding.PROPERTIES));
database.execSQL(createTableSql(visitor, TagMetadata.TABLE.name, TagMetadata.PROPERTIES));
database.execSQL(addColumnSql(Task.TABLE, Task.PUSHED_AT, visitor, null)); database.execSQL(addColumnSql(Task.TABLE, Task.PUSHED_AT, visitor, null));
database.execSQL(addColumnSql(Task.TABLE, Task.UUID, visitor, null)); database.execSQL(addColumnSql(Task.TABLE, Task.UUID, visitor, null));

@ -28,7 +28,7 @@ import com.todoroo.astrid.data.TaskOutstanding;
import com.todoroo.astrid.provider.Astrid2TaskProvider; import com.todoroo.astrid.provider.Astrid2TaskProvider;
import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.AstridPreferences; import com.todoroo.astrid.utility.AstridPreferences;
/** /**
@ -78,7 +78,7 @@ public class MetadataDao extends DatabaseDao<Metadata> {
ContentValues cv = item.getSetValues(); ContentValues cv = item.getSetValues();
return super.shouldRecordOutstanding(item) && cv != null && return super.shouldRecordOutstanding(item) && cv != null &&
((cv.containsKey(Metadata.KEY.name) && ((cv.containsKey(Metadata.KEY.name) &&
TagMetadata.KEY.equals(item.getValue(Metadata.KEY))) || TaskToTagMetadata.KEY.equals(item.getValue(Metadata.KEY))) ||
(cv.containsKey(Metadata.DELETION_DATE.name) && (cv.containsKey(Metadata.DELETION_DATE.name) &&
item.getValue(Metadata.DELETION_DATE) > 0)); item.getValue(Metadata.DELETION_DATE) > 0));
} }
@ -86,7 +86,7 @@ public class MetadataDao extends DatabaseDao<Metadata> {
@Override @Override
protected boolean createOutstandingEntries(long modelId, ContentValues modelSetValues) { protected boolean createOutstandingEntries(long modelId, ContentValues modelSetValues) {
Long taskId = modelSetValues.getAsLong(Metadata.TASK.name); Long taskId = modelSetValues.getAsLong(Metadata.TASK.name);
String tagUuid = modelSetValues.getAsString(TagMetadata.TAG_UUID.name); String tagUuid = modelSetValues.getAsString(TaskToTagMetadata.TAG_UUID.name);
Long deletionDate = modelSetValues.getAsLong(Metadata.DELETION_DATE.name); Long deletionDate = modelSetValues.getAsLong(Metadata.DELETION_DATE.name);
if (taskId == null || taskId == AbstractModel.NO_ID || RemoteModel.isUuidEmpty(tagUuid)) if (taskId == null || taskId == AbstractModel.NO_ID || RemoteModel.isUuidEmpty(tagUuid))
return false; return false;
@ -113,7 +113,7 @@ public class MetadataDao extends DatabaseDao<Metadata> {
boolean state = super.persist(item); boolean state = super.persist(item);
if(Preferences.getBoolean(AstridPreferences.P_FIRST_LIST, true)) { if(Preferences.getBoolean(AstridPreferences.P_FIRST_LIST, true)) {
if (state && item.containsNonNullValue(Metadata.KEY) && if (state && item.containsNonNullValue(Metadata.KEY) &&
item.getValue(Metadata.KEY).equals(TagMetadata.KEY)) { item.getValue(Metadata.KEY).equals(TaskToTagMetadata.KEY)) {
StatisticsService.reportEvent(StatisticsConstants.USER_FIRST_LIST); StatisticsService.reportEvent(StatisticsConstants.USER_FIRST_LIST);
Preferences.setBoolean(AstridPreferences.P_FIRST_LIST, false); Preferences.setBoolean(AstridPreferences.P_FIRST_LIST, false);
} }

@ -47,7 +47,7 @@ import com.todoroo.astrid.legacy.LegacyAlertModel;
import com.todoroo.astrid.legacy.LegacyRepeatInfo; import com.todoroo.astrid.legacy.LegacyRepeatInfo;
import com.todoroo.astrid.legacy.LegacyTaskModel; import com.todoroo.astrid.legacy.LegacyTaskModel;
import com.todoroo.astrid.legacy.TransitionalAlarm; import com.todoroo.astrid.legacy.TransitionalAlarm;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
public class Astrid2To3UpgradeHelper { public class Astrid2To3UpgradeHelper {
@ -400,7 +400,7 @@ public class Astrid2To3UpgradeHelper {
return; return;
Metadata metadata = new Metadata(); Metadata metadata = new Metadata();
metadata.setValue(Metadata.KEY, TagMetadata.KEY); metadata.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
long tagId = -1; long tagId = -1;
String tag = null; String tag = null;
for(mapCursor.moveToFirst(); !mapCursor.isAfterLast(); mapCursor.moveToNext()) { for(mapCursor.moveToFirst(); !mapCursor.isAfterLast(); mapCursor.moveToNext()) {
@ -417,8 +417,8 @@ public class Astrid2To3UpgradeHelper {
tag = tagCursor.getString(1); tag = tagCursor.getString(1);
long task = mapCursor.getLong(1); long task = mapCursor.getLong(1);
metadata.setValue(Metadata.TASK, task); metadata.setValue(Metadata.TASK, task);
metadata.setValue(Metadata.KEY, TagMetadata.KEY); metadata.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
metadata.setValue(TagMetadata.TAG_NAME, tag); metadata.setValue(TaskToTagMetadata.TAG_NAME, tag);
metadataDao.createNew(metadata); metadataDao.createNew(metadata);
metadata.clearValue(Metadata.ID); metadata.clearValue(Metadata.ID);
} }

@ -67,7 +67,7 @@ import com.todoroo.astrid.service.abtesting.ABChooser;
import com.todoroo.astrid.service.abtesting.ABTestInvoker; import com.todoroo.astrid.service.abtesting.ABTestInvoker;
import com.todoroo.astrid.service.abtesting.ABTests; import com.todoroo.astrid.service.abtesting.ABTests;
import com.todoroo.astrid.subtasks.SubtasksMetadata; import com.todoroo.astrid.subtasks.SubtasksMetadata;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.ui.TaskListFragmentPager; import com.todoroo.astrid.ui.TaskListFragmentPager;
import com.todoroo.astrid.utility.AstridPreferences; import com.todoroo.astrid.utility.AstridPreferences;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
@ -274,9 +274,9 @@ public class StartupService {
Metadata m = new Metadata(); Metadata m = new Metadata();
if (values != null) { if (values != null) {
if (values.containsKey(TagData.NAME.name)) { if (values.containsKey(TagData.NAME.name)) {
m.setValue(TagMetadata.TAG_NAME, model.getValue(TagData.NAME)); m.setValue(TaskToTagMetadata.TAG_NAME, model.getValue(TagData.NAME));
PluginServices.getMetadataService().update(Criterion.and(MetadataCriteria.withKey(TagMetadata.KEY), PluginServices.getMetadataService().update(Criterion.and(MetadataCriteria.withKey(TaskToTagMetadata.KEY),
TagMetadata.TAG_UUID.eq(model.getValue(TagData.UUID))), m); TaskToTagMetadata.TAG_UUID.eq(model.getValue(TagData.UUID))), m);
} }
} }
} }

@ -39,7 +39,7 @@ import com.todoroo.astrid.gcal.GCalHelper;
import com.todoroo.astrid.gtasks.GtasksMetadata; import com.todoroo.astrid.gtasks.GtasksMetadata;
import com.todoroo.astrid.opencrx.OpencrxCoreUtils; import com.todoroo.astrid.opencrx.OpencrxCoreUtils;
import com.todoroo.astrid.producteev.sync.ProducteevTask; import com.todoroo.astrid.producteev.sync.ProducteevTask;
import com.todoroo.astrid.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.utility.TitleParser; import com.todoroo.astrid.utility.TitleParser;
@ -550,13 +550,13 @@ public class TaskService {
Metadata metadata = new Metadata(); Metadata metadata = new Metadata();
metadata.setValue(Metadata.TASK, task.getId()); metadata.setValue(Metadata.TASK, task.getId());
metadata.mergeWith(forMetadata); metadata.mergeWith(forMetadata);
if (TagMetadata.KEY.equals(metadata.getValue(Metadata.KEY))) { if (TaskToTagMetadata.KEY.equals(metadata.getValue(Metadata.KEY))) {
if (metadata.containsNonNullValue(TagMetadata.TAG_UUID) && !RemoteModel.NO_UUID.equals(metadata.getValue(TagMetadata.TAG_UUID))) { if (metadata.containsNonNullValue(TaskToTagMetadata.TAG_UUID) && !RemoteModel.NO_UUID.equals(metadata.getValue(TaskToTagMetadata.TAG_UUID))) {
// This is more efficient // This is more efficient
TagService.getInstance().createLink(task, metadata.getValue(TagMetadata.TAG_NAME), metadata.getValue(TagMetadata.TAG_UUID)); TagService.getInstance().createLink(task, metadata.getValue(TaskToTagMetadata.TAG_NAME), metadata.getValue(TaskToTagMetadata.TAG_UUID));
} else { } else {
// This is necessary for backwards compatibility // This is necessary for backwards compatibility
TagService.getInstance().createLink(task, metadata.getValue(TagMetadata.TAG_NAME)); TagService.getInstance().createLink(task, metadata.getValue(TaskToTagMetadata.TAG_NAME));
} }
} else { } else {
PluginServices.getMetadataService().save(metadata); PluginServices.getMetadataService().save(metadata);

@ -18,7 +18,7 @@ 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.tags.TagMetadata; import com.todoroo.astrid.tags.TaskToTagMetadata;
public class AstridNewSyncMigrationTest extends NewSyncTestCase { public class AstridNewSyncMigrationTest extends NewSyncTestCase {
@ -47,44 +47,44 @@ public class AstridNewSyncMigrationTest extends NewSyncTestCase {
} }
Metadata m = new Metadata(); Metadata m = new Metadata();
m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
m.setValue(Metadata.TASK, 1L); m.setValue(Metadata.TASK, 1L);
m.setValue(TagMetadata.TAG_NAME, "Tag 1"); m.setValue(TaskToTagMetadata.TAG_NAME, "Tag 1");
metadataDao.createNew(m); metadataDao.createNew(m);
m.clear(); m.clear();
m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
m.setValue(Metadata.TASK, 2L); m.setValue(Metadata.TASK, 2L);
m.setValue(TagMetadata.TAG_NAME, "New tag"); m.setValue(TaskToTagMetadata.TAG_NAME, "New tag");
metadataDao.createNew(m); metadataDao.createNew(m);
m.clear(); m.clear();
m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
m.setValue(Metadata.TASK, 3L); m.setValue(Metadata.TASK, 3L);
m.setValue(TagMetadata.TAG_NAME, "Tag 3"); m.setValue(TaskToTagMetadata.TAG_NAME, "Tag 3");
metadataDao.createNew(m); metadataDao.createNew(m);
m.clear(); m.clear();
m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
m.setValue(Metadata.TASK, 3L); m.setValue(Metadata.TASK, 3L);
m.setValue(TagMetadata.TAG_NAME, "Tag 4"); m.setValue(TaskToTagMetadata.TAG_NAME, "Tag 4");
metadataDao.createNew(m); metadataDao.createNew(m);
m.clear(); m.clear();
m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
m.setValue(Metadata.TASK, 5L); m.setValue(Metadata.TASK, 5L);
m.setValue(TagMetadata.TAG_NAME, "Tag 1"); m.setValue(TaskToTagMetadata.TAG_NAME, "Tag 1");
metadataDao.createNew(m); metadataDao.createNew(m);
m.clear(); m.clear();
m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
m.setValue(Metadata.TASK, 5L); m.setValue(Metadata.TASK, 5L);
m.setValue(TagMetadata.TAG_NAME, "Tag 5"); m.setValue(TaskToTagMetadata.TAG_NAME, "Tag 5");
metadataDao.createNew(m); metadataDao.createNew(m);
m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.KEY, TaskToTagMetadata.KEY);
m.setValue(Metadata.TASK, 5L); m.setValue(Metadata.TASK, 5L);
m.setValue(TagMetadata.TAG_NAME, "New tag 2"); m.setValue(TaskToTagMetadata.TAG_NAME, "New tag 2");
metadataDao.createNew(m); metadataDao.createNew(m);
// State (task: tags) // State (task: tags)
@ -138,15 +138,15 @@ public class AstridNewSyncMigrationTest extends NewSyncTestCase {
private void assertAllMetadataHasAllFields() { private void assertAllMetadataHasAllFields() {
TodorooCursor<Metadata> tagMetadata = metadataDao.query(Query.select(Metadata.PROPERTIES) TodorooCursor<Metadata> tagMetadata = metadataDao.query(Query.select(Metadata.PROPERTIES)
.where(MetadataCriteria.withKey(TagMetadata.KEY))); .where(MetadataCriteria.withKey(TaskToTagMetadata.KEY)));
try { try {
assertEquals(tagMetadata.getCount(), 7); assertEquals(tagMetadata.getCount(), 7);
Metadata m = new Metadata(); Metadata m = new Metadata();
for (tagMetadata.moveToFirst(); !tagMetadata.isAfterLast(); tagMetadata.moveToNext()) { for (tagMetadata.moveToFirst(); !tagMetadata.isAfterLast(); tagMetadata.moveToNext()) {
m.readFromCursor(tagMetadata); m.readFromCursor(tagMetadata);
assertTrue(!TextUtils.isEmpty(m.getValue(TagMetadata.TAG_NAME))); assertTrue(!TextUtils.isEmpty(m.getValue(TaskToTagMetadata.TAG_NAME)));
assertTrue(!RemoteModel.NO_UUID.equals(m.getValue(TagMetadata.TASK_UUID))); assertTrue(!RemoteModel.NO_UUID.equals(m.getValue(TaskToTagMetadata.TASK_UUID)));
assertTrue(!RemoteModel.NO_UUID.equals(m.getValue(TagMetadata.TAG_UUID))); assertTrue(!RemoteModel.NO_UUID.equals(m.getValue(TaskToTagMetadata.TAG_UUID)));
} }
} finally { } finally {
tagMetadata.close(); tagMetadata.close();

Loading…
Cancel
Save