Move TaskService.createWithValues to TaskCreator

pull/467/head
Alex Baker 9 years ago
parent f96490641a
commit 7348ea881a

@ -25,7 +25,7 @@ import static junit.framework.Assert.assertEquals;
@RunWith(AndroidJUnit4.class)
public class QuickAddMarkupTest extends DatabaseTestCase {
@Inject TaskService taskService;
@Inject TaskCreator taskCreator;
@Override
protected void inject(TestComponent component) {
@ -102,11 +102,10 @@ public class QuickAddMarkupTest extends DatabaseTestCase {
task = new Task();
task.setTitle(title);
tags.clear();
taskService.parseQuickAddMarkup(task, tags);
taskCreator.parseQuickAddMarkup(task, tags);
}
private void assertImportanceIs(int importance) {
assertEquals(importance, (int)task.getImportance());
}
}

@ -9,6 +9,7 @@ import android.support.test.runner.AndroidJUnit4;
import com.google.ical.values.Frequency;
import com.google.ical.values.RRule;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.test.DatabaseTestCase;
@ -35,9 +36,10 @@ import static org.tasks.date.DateTimeUtils.newDateTime;
@RunWith(AndroidJUnit4.class)
public class TitleParserTest extends DatabaseTestCase {
@Inject TaskService taskService;
@Inject TaskDao taskDao;
@Inject TagService tagService;
@Inject Preferences preferences;
@Inject TaskCreator taskCreator;
@Override
public void setUp() {
@ -56,7 +58,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
Task nothing = new Task();
task.setTitle("Jog");
taskService.save(task);
taskDao.save(task);
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
assertEquals(task.getRecurrence(), nothing.getRecurrence());
@ -179,7 +181,7 @@ public class TitleParserTest extends DatabaseTestCase {
private void insertTitleAddTask(String title, Task task) {
task.clear();
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
}
@ -191,7 +193,7 @@ public class TitleParserTest extends DatabaseTestCase {
String title = "Jog today";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
DateTime date = newDateTime(task.getDueDate());
assertEquals(date.getDayOfWeek(), today.get(Calendar.DAY_OF_WEEK));
//Calendar starts 1-6, date.getDay() starts at 0
@ -199,7 +201,7 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
title = "Jog tomorrow";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
date = newDateTime(task.getDueDate());
assertEquals((date.getDayOfWeek()) % 7, (today.get(Calendar.DAY_OF_WEEK)+1) % 7);
@ -226,14 +228,14 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
title = "Jog "+ days[i];
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
date = newDateTime(task.getDueDate());
assertEquals(date.getDayOfWeek(), i + 1);
task = new Task();
title = "Jog "+ abrevDays[i];
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
date = newDateTime(task.getDueDate());
assertEquals(date.getDayOfWeek(), i + 1);
}
@ -258,14 +260,14 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
String title = "Jog " + acceptedString;
task.setTitle(title); //test at end of task. should set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_NONE);
}
for (String acceptedString:acceptedStrings){
task = new Task();
String title = acceptedString + " jog";
task.setTitle(title); //test at beginning of task. should not set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertNotSame(task.getImportance(),Task.IMPORTANCE_NONE);
}
}
@ -286,23 +288,23 @@ public class TitleParserTest extends DatabaseTestCase {
for (String acceptedStringAtEnd:acceptedStringsAtEnd){
task = new Task();
task.setTitle("Jog " + acceptedStringAtEnd); //test at end of task. should set importance.
taskService.save(task);
taskDao.save(task);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_SHOULD_DO);
}
for (String acceptedStringAtEnd:acceptedStringsAtEnd){
task = new Task();
task.setTitle(acceptedStringAtEnd + " jog"); //test at beginning of task. should not set importance.
taskService.save(task);
taskDao.save(task);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_SHOULD_DO);
}
for (String acceptedStringAnywhere:acceptedStringsAnywhere){
task = new Task();
task.setTitle("Jog " + acceptedStringAnywhere); //test at end of task. should set importance.
taskService.save(task);
taskDao.save(task);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_SHOULD_DO);
task.setTitle(acceptedStringAnywhere + " jog"); //test at beginning of task. should set importance.
taskService.save(task);
taskDao.save(task);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_SHOULD_DO);
}
}
@ -324,25 +326,25 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
String title = "Jog " + acceptedStringAtEnd;
task.setTitle(title); //test at end of task. should set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_MUST_DO);
task = new Task();
title = acceptedStringAtEnd + " jog";
task.setTitle(title); //test at beginning of task. should not set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertNotSame(task.getImportance(), Task.IMPORTANCE_MUST_DO);
}
for (String acceptedStringAnywhere:acceptedStringsAnywhere){
task = new Task();
String title = "Jog " + acceptedStringAnywhere;
task.setTitle(title); //test at end of task. should set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_MUST_DO);
title = acceptedStringAnywhere + " jog";
task.setTitle(title); //test at beginning of task. should set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_MUST_DO);
}
}
@ -367,25 +369,25 @@ public class TitleParserTest extends DatabaseTestCase {
task = new Task();
String title = "Jog " + acceptedStringAtEnd;
task.setTitle(title); //test at end of task. should set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_DO_OR_DIE);
task = new Task();
title = acceptedStringAtEnd + " jog";
task.setTitle(title); //test at beginning of task. should not set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertNotSame(task.getImportance(), Task.IMPORTANCE_DO_OR_DIE);
}
for (String acceptedStringAnywhere:acceptedStringsAnywhere){
task = new Task();
String title = "Jog " + acceptedStringAnywhere;
task.setTitle(title); //test at end of task. should set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_DO_OR_DIE);
title = acceptedStringAnywhere + " jog";
task.setTitle(title); //test at beginning of task. should set importance.
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals((int)task.getImportance(), Task.IMPORTANCE_DO_OR_DIE);
}
}
@ -400,7 +402,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog daily";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.DAILY);
rrule.setInterval(1);
@ -410,7 +412,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every day";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -419,7 +421,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " days.";
task.setTitle(title);
rrule.setInterval(i);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -434,7 +436,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog weekly";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.WEEKLY);
rrule.setInterval(1);
@ -444,7 +446,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every week";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -453,7 +455,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " weeks";
task.setTitle(title);
rrule.setInterval(i);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -467,7 +469,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog monthly";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.MONTHLY);
rrule.setInterval(1);
@ -477,7 +479,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every month";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -486,7 +488,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " months";
task.setTitle(title);
rrule.setInterval(i);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertFalse(task.hasDueTime());
assertFalse(task.hasDueDate());
@ -499,7 +501,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog daily starting from today";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.DAILY);
rrule.setInterval(1);
@ -510,7 +512,7 @@ public class TitleParserTest extends DatabaseTestCase {
task.clearValue(Task.UUID);
title = "Jog every day starting from today";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertTrue(task.hasDueDate());
@ -518,7 +520,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " days starting from today";
task.setTitle(title);
rrule.setInterval(i);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertTrue(task.hasDueDate());
task = new Task();
@ -530,7 +532,7 @@ public class TitleParserTest extends DatabaseTestCase {
Task task = new Task();
String title = "Jog weekly starting from today";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
RRule rrule = new RRule();
rrule.setFreq(Frequency.WEEKLY);
rrule.setInterval(1);
@ -541,7 +543,7 @@ public class TitleParserTest extends DatabaseTestCase {
task.clearValue(Task.UUID);
title = "Jog every week starting from today";
task.setTitle(title);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertTrue(task.hasDueDate());
@ -549,7 +551,7 @@ public class TitleParserTest extends DatabaseTestCase {
title = "Jog every " + i + " weeks starting from today";
task.setTitle(title);
rrule.setInterval(i);
taskService.createWithValues(task, null, title);
taskCreator.createWithValues(task, null, title);
assertEquals(task.getRecurrence(), rrule.toIcal());
assertTrue(task.hasDueDate());
task = new Task();

@ -19,7 +19,6 @@ import android.view.View;
import android.view.inputmethod.InputMethodManager;
import com.todoroo.andlib.utility.AndroidUtilities;
import org.tasks.activities.TagSettingsActivity;
import com.todoroo.astrid.actfm.TagViewFragment;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
@ -28,13 +27,14 @@ import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.api.TagFilter;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksList;
import com.todoroo.astrid.gtasks.GtasksListFragment;
import com.todoroo.astrid.gtasks.GtasksListService;
import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.TaskCreator;
import com.todoroo.astrid.subtasks.SubtasksHelper;
import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
@ -42,6 +42,7 @@ import com.todoroo.astrid.timers.TimerControlSet;
import org.tasks.Broadcaster;
import org.tasks.R;
import org.tasks.activities.TagSettingsActivity;
import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.dialogs.SortDialog;
@ -83,7 +84,6 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
@Inject Preferences preferences;
@Inject SubtasksHelper subtasksHelper;
@Inject TaskService taskService;
@Inject RepeatConfirmationReceiver repeatConfirmationReceiver;
@Inject DefaultFilterProvider defaultFilterProvider;
@Inject GtasksListService gtasksListService;
@ -93,6 +93,8 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
@Inject ThemeCache themeCache;
@Inject SyncAdapterHelper syncAdapterHelper;
@Inject Tracker tracker;
@Inject TaskCreator taskCreator;
@Inject TaskDao taskDao;
@BindView(R.id.drawer_layout) DrawerLayout drawerLayout;
@ -417,7 +419,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
Task model = null;
if (taskId> -1L) {
model = taskService.fetchById(taskId, Task.PROPERTIES);
model = taskDao.fetch(taskId, Task.PROPERTIES);
}
// not found by id or was never passed an id
@ -434,7 +436,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
// oops, can't serialize
Timber.e(e, e.getMessage());
}
model = taskService.createWithValues(values, null);
model = taskCreator.createWithValues(values, null);
}
return model;

@ -344,7 +344,7 @@ public class TaskListFragment extends InjectingListFragment implements
}
public Task addTask(String title) {
return taskService.createWithValues(filter.valuesForNewTasks, title);
return taskCreator.createWithValues(filter.valuesForNewTasks, title);
}
@Override

@ -4,25 +4,53 @@ import android.content.ContentValues;
import android.net.Uri;
import android.text.TextUtils;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gcal.GCalHelper;
import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.TitleParser;
import org.tasks.preferences.Preferences;
import java.util.ArrayList;
import java.util.Map;
import javax.inject.Inject;
import timber.log.Timber;
public class TaskCreator {
private final TaskService taskService;
private final GCalHelper gcalHelper;
private final Preferences preferences;
private final MetadataDao metadataDao;
private final TagDataDao tagDataDao;
private final TaskDao taskDao;
private final TagService tagService;
@Inject
public TaskCreator(TaskService taskService, GCalHelper gcalHelper, Preferences preferences) {
public TaskCreator(TaskService taskService, GCalHelper gcalHelper, Preferences preferences,
MetadataDao metadataDao, TagDataDao tagDataDao, TaskDao taskDao,
TagService tagService) {
this.taskService = taskService;
this.gcalHelper = gcalHelper;
this.preferences = preferences;
this.metadataDao = metadataDao;
this.tagDataDao = tagDataDao;
this.taskDao = taskDao;
this.tagService = tagService;
}
public Task basicQuickAddTask(String title) {
@ -32,7 +60,7 @@ public class TaskCreator {
title = title.trim();
Task task = taskService.createWithValues(null, title);
Task task = createWithValues(null, title);
addToCalendar(task);
return task;
@ -47,4 +75,102 @@ public class TaskCreator {
taskService.save(task);
}
}
/**
* Create task from the given content values, saving it. This version
* doesn't need to start with a base task model.
*/
public Task createWithValues(ContentValues values, String title) {
return createWithValues(new Task(), values, title);
}
Task createWithValues(Task task, ContentValues values, String title) {
if (title != null) {
task.setTitle(title.trim());
}
ArrayList<String> tags = new ArrayList<>();
try {
parseQuickAddMarkup(task, tags);
} catch (Throwable e) {
Timber.e(e, e.getMessage());
}
ContentValues forMetadata = null;
if (values != null && values.size() > 0) {
ContentValues forTask = new ContentValues();
forMetadata = new ContentValues();
outer: for (Map.Entry<String, Object> item : values.valueSet()) {
String key = item.getKey();
Object value = item.getValue();
if (value instanceof String) {
value = PermaSql.replacePlaceholders((String) value);
}
for (Property<?> property : Metadata.PROPERTIES) {
if (property.name.equals(key)) {
AndroidUtilities.putInto(forMetadata, key, value);
continue outer;
}
}
AndroidUtilities.putInto(forTask, key, value);
}
task.mergeWithoutReplacement(forTask);
}
saveWithoutPublishingFilterUpdate(task);
for(String tag : tags) {
createLink(task, tag);
}
if (forMetadata != null && forMetadata.size() > 0) {
Metadata metadata = new Metadata();
metadata.setTask(task.getId());
metadata.mergeWith(forMetadata);
if (TaskToTagMetadata.KEY.equals(metadata.getKey())) {
if (metadata.containsNonNullValue(TaskToTagMetadata.TAG_UUID) && !RemoteModel.NO_UUID.equals(metadata.getValue(TaskToTagMetadata.TAG_UUID))) {
// This is more efficient
createLink(task, metadata.getValue(TaskToTagMetadata.TAG_NAME), metadata.getValue(TaskToTagMetadata.TAG_UUID));
} else {
// This is necessary for backwards compatibility
createLink(task, metadata.getValue(TaskToTagMetadata.TAG_NAME));
}
} else {
metadataDao.persist(metadata);
}
}
return task;
}
private void saveWithoutPublishingFilterUpdate(Task item) {
taskDao.save(item);
}
private void createLink(Task task, String tagName) {
TagData tagData = tagDataDao.getTagByName(tagName, TagData.NAME, TagData.UUID);
if (tagData == null) {
tagData = new TagData();
tagData.setName(tagName);
tagDataDao.persist(tagData);
}
createLink(task, tagData.getName(), tagData.getUUID());
}
private void createLink(Task task, String tagName, String tagUuid) {
Metadata link = TaskToTagMetadata.newTagMetadata(task.getId(), task.getUuid(), tagName, tagUuid);
if (metadataDao.update(Criterion.and(MetadataDao.MetadataCriteria.byTaskAndwithKey(task.getId(), TaskToTagMetadata.KEY),
TaskToTagMetadata.TASK_UUID.eq(task.getUUID()), TaskToTagMetadata.TAG_UUID.eq(tagUuid)), link) <= 0) {
metadataDao.createNew(link);
}
}
/**
* Parse quick add markup for the given task
* @param tags an empty array to apply tags to
*/
void parseQuickAddMarkup(Task task, ArrayList<String> tags) {
TitleParser.parse(tagService, task, tags);
}
}

@ -5,38 +5,22 @@
*/
package com.todoroo.astrid.service;
import android.content.ContentValues;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.TitleParser;
import org.tasks.Broadcaster;
import org.tasks.injection.ApplicationScope;
import org.tasks.scheduling.RefreshScheduler;
import java.util.ArrayList;
import java.util.Map.Entry;
import javax.inject.Inject;
import timber.log.Timber;
/**
* Service layer for {@link Task}-centered activities.
@ -47,22 +31,15 @@ import timber.log.Timber;
@ApplicationScope
public class TaskService {
private final TagDataDao tagDataDao;
private final TaskDao taskDao;
private final Broadcaster broadcaster;
private final RefreshScheduler refreshScheduler;
private final TagService tagService;
private final MetadataDao metadataDao;
@Inject
public TaskService(TagDataDao tagDataDao, TaskDao taskDao, Broadcaster broadcaster,
RefreshScheduler refreshScheduler, TagService tagService, MetadataDao metadataDao) {
this.tagDataDao = tagDataDao;
public TaskService(TaskDao taskDao, Broadcaster broadcaster, RefreshScheduler refreshScheduler) {
this.taskDao = taskDao;
this.broadcaster = broadcaster;
this.refreshScheduler = refreshScheduler;
this.tagService = tagService;
this.metadataDao = metadataDao;
}
// --- service layer
@ -97,10 +74,6 @@ public class TaskService {
return databaseChanged;
}
private void saveWithoutPublishingFilterUpdate(Task item) {
taskDao.save(item);
}
/**
* Fetch tasks for the given filter
* @param constraint text constraint, or null
@ -136,98 +109,4 @@ public class TaskService {
return taskDao.query(Query.select(properties).withQueryTemplate(sql));
}
/**
* Parse quick add markup for the given task
* @param tags an empty array to apply tags to
*/
void parseQuickAddMarkup(Task task, ArrayList<String> tags) {
TitleParser.parse(tagService, task, tags);
}
/**
* Create task from the given content values, saving it. This version
* doesn't need to start with a base task model.
*/
public Task createWithValues(ContentValues values, String title) {
return createWithValues(new Task(), values, title);
}
Task createWithValues(Task task, ContentValues values, String title) {
if (title != null) {
task.setTitle(title.trim());
}
ArrayList<String> tags = new ArrayList<>();
try {
parseQuickAddMarkup(task, tags);
} catch (Throwable e) {
Timber.e(e, e.getMessage());
}
ContentValues forMetadata = null;
if (values != null && values.size() > 0) {
ContentValues forTask = new ContentValues();
forMetadata = new ContentValues();
outer: for (Entry<String, Object> item : values.valueSet()) {
String key = item.getKey();
Object value = item.getValue();
if (value instanceof String) {
value = PermaSql.replacePlaceholders((String) value);
}
for (Property<?> property : Metadata.PROPERTIES) {
if (property.name.equals(key)) {
AndroidUtilities.putInto(forMetadata, key, value);
continue outer;
}
}
AndroidUtilities.putInto(forTask, key, value);
}
task.mergeWithoutReplacement(forTask);
}
saveWithoutPublishingFilterUpdate(task);
for(String tag : tags) {
createLink(task, tag);
}
if (forMetadata != null && forMetadata.size() > 0) {
Metadata metadata = new Metadata();
metadata.setTask(task.getId());
metadata.mergeWith(forMetadata);
if (TaskToTagMetadata.KEY.equals(metadata.getKey())) {
if (metadata.containsNonNullValue(TaskToTagMetadata.TAG_UUID) && !RemoteModel.NO_UUID.equals(metadata.getValue(TaskToTagMetadata.TAG_UUID))) {
// This is more efficient
createLink(task, metadata.getValue(TaskToTagMetadata.TAG_NAME), metadata.getValue(TaskToTagMetadata.TAG_UUID));
} else {
// This is necessary for backwards compatibility
createLink(task, metadata.getValue(TaskToTagMetadata.TAG_NAME));
}
} else {
metadataDao.persist(metadata);
}
}
return task;
}
private void createLink(Task task, String tagName) {
TagData tagData = tagDataDao.getTagByName(tagName, TagData.NAME, TagData.UUID);
if (tagData == null) {
tagData = new TagData();
tagData.setName(tagName);
tagDataDao.persist(tagData);
}
createLink(task, tagData.getName(), tagData.getUUID());
}
private void createLink(Task task, String tagName, String tagUuid) {
Metadata link = TaskToTagMetadata.newTagMetadata(task.getId(), task.getUuid(), tagName, tagUuid);
if (metadataDao.update(Criterion.and(MetadataDao.MetadataCriteria.byTaskAndwithKey(task.getId(), TaskToTagMetadata.KEY),
TaskToTagMetadata.TASK_UUID.eq(task.getUUID()), TaskToTagMetadata.TAG_UUID.eq(tagUuid)), link) <= 0) {
metadataDao.createNew(link);
}
}
}

Loading…
Cancel
Save