diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java deleted file mode 100644 index 986549a27..000000000 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.todoroo.astrid.service; - -import static com.todoroo.andlib.utility.DateUtilities.now; -import static com.todoroo.astrid.helper.UUIDHelper.newUUID; -import static org.tasks.Strings.isNullOrEmpty; - -import android.net.Uri; -import androidx.annotation.Nullable; -import com.todoroo.andlib.utility.DateUtilities; -import com.todoroo.astrid.api.CaldavFilter; -import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.api.GtasksFilter; -import com.todoroo.astrid.api.PermaSql; -import com.todoroo.astrid.dao.TaskDaoBlocking; -import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.gcal.GCalHelper; -import com.todoroo.astrid.utility.TitleParser; -import java.util.ArrayList; -import java.util.Map; -import javax.inject.Inject; -import org.tasks.R; -import org.tasks.data.CaldavDaoBlocking; -import org.tasks.data.CaldavTask; -import org.tasks.data.Geofence; -import org.tasks.data.GoogleTask; -import org.tasks.data.GoogleTaskDaoBlocking; -import org.tasks.data.LocationDaoBlocking; -import org.tasks.data.Place; -import org.tasks.data.Tag; -import org.tasks.data.TagDaoBlocking; -import org.tasks.data.TagData; -import org.tasks.data.TagDataDaoBlocking; -import org.tasks.preferences.DefaultFilterProvider; -import org.tasks.preferences.Preferences; -import timber.log.Timber; - -public class TaskCreator { - - private final GCalHelper gcalHelper; - private final Preferences preferences; - private final TagDaoBlocking tagDao; - private final GoogleTaskDaoBlocking googleTaskDao; - private final DefaultFilterProvider defaultFilterProvider; - private final CaldavDaoBlocking caldavDao; - private final LocationDaoBlocking locationDao; - private final TagDataDaoBlocking tagDataDao; - private final TaskDaoBlocking taskDao; - - @Inject - public TaskCreator( - GCalHelper gcalHelper, - Preferences preferences, - TagDataDaoBlocking tagDataDao, - TaskDaoBlocking taskDao, - TagDaoBlocking tagDao, - GoogleTaskDaoBlocking googleTaskDao, - DefaultFilterProvider defaultFilterProvider, - CaldavDaoBlocking caldavDao, - LocationDaoBlocking locationDao) { - this.gcalHelper = gcalHelper; - this.preferences = preferences; - this.tagDataDao = tagDataDao; - this.taskDao = taskDao; - this.tagDao = tagDao; - this.googleTaskDao = googleTaskDao; - this.defaultFilterProvider = defaultFilterProvider; - this.caldavDao = caldavDao; - this.locationDao = locationDao; - } - - private static void setDefaultReminders(Preferences preferences, Task task) { - task.setReminderPeriod( - DateUtilities.ONE_HOUR - * preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, 0)); - task.setReminderFlags(preferences.getDefaultReminders() | preferences.getDefaultRingMode()); - } - - public Task basicQuickAddTask(String title) { - title = title.trim(); - - Task task = createWithValues(title); - taskDao.createNew(task); - - boolean gcalCreateEventEnabled = - preferences.isDefaultCalendarSet() && task.hasDueDate(); // $NON-NLS-1$ - if (!isNullOrEmpty(task.getTitle()) - && gcalCreateEventEnabled - && isNullOrEmpty(task.getCalendarURI())) { - Uri calendarUri = gcalHelper.createTaskEvent(task, preferences.getDefaultCalendar()); - task.setCalendarURI(calendarUri.toString()); - } - - createTags(task); - - boolean addToTop = preferences.addTasksToTop(); - if (task.hasTransitory(GoogleTask.KEY)) { - googleTaskDao.insertAndShift( - new GoogleTask(task.getId(), task.getTransitory(GoogleTask.KEY)), addToTop); - } else if (task.hasTransitory(CaldavTask.KEY)) { - caldavDao.insert( - task, new CaldavTask(task.getId(), task.getTransitory(CaldavTask.KEY)), addToTop); - } else { - Filter remoteList = defaultFilterProvider.getDefaultList(); - if (remoteList instanceof GtasksFilter) { - googleTaskDao.insertAndShift( - new GoogleTask(task.getId(), ((GtasksFilter) remoteList).getRemoteId()), addToTop); - } else if (remoteList instanceof CaldavFilter) { - caldavDao.insert( - task, new CaldavTask(task.getId(), ((CaldavFilter) remoteList).getUuid()), addToTop); - } - } - - if (task.hasTransitory(Place.KEY)) { - Place place = locationDao.getPlace(task.getTransitory(Place.KEY)); - if (place != null) { - locationDao.insert(new Geofence(place.getUid(), preferences)); - } - } - - taskDao.save(task, null); - return task; - } - - public Task createWithValues(String title) { - return create(null, title); - } - - public Task createWithValues(Filter filter, String title) { - return create(filter == null ? null : filter.valuesForNewTasks, title); - } - /** - * Create task from the given content values, saving it. This version doesn't need to start with a - * base task model. - */ - private Task create(@Nullable Map values, String title) { - Task task = new Task(); - task.setCreationDate(now()); - task.setModificationDate(now()); - if (title != null) { - task.setTitle(title.trim()); - } - - task.setUuid(newUUID()); - - task.setPriority(preferences.getDefaultPriority()); - task.setDueDate( - Task.createDueDate( - preferences.getIntegerFromString(R.string.p_default_urgency_key, Task.URGENCY_NONE), - 0)); - int setting = - preferences.getIntegerFromString(R.string.p_default_hideUntil_key, Task.HIDE_UNTIL_NONE); - task.setHideUntil(task.createHideUntil(setting, 0)); - setDefaultReminders(preferences, task); - - ArrayList tags = new ArrayList<>(); - - if (values != null && values.size() > 0) { - for (Map.Entry item : values.entrySet()) { - String key = item.getKey(); - Object value = item.getValue(); - switch (key) { - case Tag.KEY: - tags.add((String) value); - break; - case GoogleTask.KEY: - case CaldavTask.KEY: - case Place.KEY: - task.putTransitory(key, value); - break; - default: - if (value instanceof String) { - value = PermaSql.replacePlaceholdersForNewTask((String) value); - } - - switch (key) { - case "dueDate": - task.setDueDate(Long.valueOf((String) value)); - break; - case "importance": - task.setPriority(Integer.valueOf((String) value)); - break; - default: - break; - } - break; - } - } - } - - try { - TitleParser.parse(tagDataDao, task, tags); - } catch (Throwable e) { - Timber.e(e); - } - - task.setTags(tags); - - return task; - } - - public void createTags(Task task) { - for (String tag : task.getTags()) { - TagData tagData = tagDataDao.getTagByName(tag); - if (tagData == null) { - tagData = new TagData(); - tagData.setName(tag); - tagDataDao.createNew(tagData); - } - tagDao.insert(new Tag(task, tagData)); - } - } -} diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt new file mode 100644 index 000000000..9629e15ff --- /dev/null +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt @@ -0,0 +1,150 @@ +package com.todoroo.astrid.service + +import com.todoroo.andlib.utility.DateUtilities +import com.todoroo.astrid.api.CaldavFilter +import com.todoroo.astrid.api.Filter +import com.todoroo.astrid.api.GtasksFilter +import com.todoroo.astrid.api.PermaSql +import com.todoroo.astrid.dao.TaskDaoBlocking +import com.todoroo.astrid.data.Task +import com.todoroo.astrid.data.Task.Companion.createDueDate +import com.todoroo.astrid.gcal.GCalHelper +import com.todoroo.astrid.helper.UUIDHelper +import com.todoroo.astrid.utility.TitleParser.parse +import org.tasks.R +import org.tasks.Strings.isNullOrEmpty +import org.tasks.data.* +import org.tasks.preferences.DefaultFilterProvider +import org.tasks.preferences.Preferences +import timber.log.Timber +import java.util.* +import javax.inject.Inject + +class TaskCreator @Inject constructor( + private val gcalHelper: GCalHelper, + private val preferences: Preferences, + private val tagDataDao: TagDataDaoBlocking, + private val taskDao: TaskDaoBlocking, + private val tagDao: TagDaoBlocking, + private val googleTaskDao: GoogleTaskDaoBlocking, + private val defaultFilterProvider: DefaultFilterProvider, + private val caldavDao: CaldavDaoBlocking, + private val locationDao: LocationDaoBlocking) { + fun basicQuickAddTask(title: String): Task { + var title = title + title = title.trim { it <= ' ' } + val task = createWithValues(title) + taskDao.createNew(task) + val gcalCreateEventEnabled = preferences.isDefaultCalendarSet && task.hasDueDate() // $NON-NLS-1$ + if (!isNullOrEmpty(task.title) + && gcalCreateEventEnabled + && isNullOrEmpty(task.calendarURI)) { + val calendarUri = gcalHelper.createTaskEvent(task, preferences.defaultCalendar) + task.calendarURI = calendarUri.toString() + } + createTags(task) + val addToTop = preferences.addTasksToTop() + if (task.hasTransitory(GoogleTask.KEY)) { + googleTaskDao.insertAndShift( + GoogleTask(task.id, task.getTransitory(GoogleTask.KEY)!!), addToTop) + } else if (task.hasTransitory(CaldavTask.KEY)) { + caldavDao.insert( + task, CaldavTask(task.id, task.getTransitory(CaldavTask.KEY)), addToTop) + } else { + val remoteList = defaultFilterProvider.defaultList + if (remoteList is GtasksFilter) { + googleTaskDao.insertAndShift( + GoogleTask(task.id, remoteList.remoteId), addToTop) + } else if (remoteList is CaldavFilter) { + caldavDao.insert( + task, CaldavTask(task.id, remoteList.uuid), addToTop) + } + } + if (task.hasTransitory(Place.KEY)) { + val place = locationDao.getPlace(task.getTransitory(Place.KEY)!!) + if (place != null) { + locationDao.insert(Geofence(place.uid, preferences)) + } + } + taskDao.save(task, null) + return task + } + + fun createWithValues(title: String?): Task { + return create(null, title) + } + + fun createWithValues(filter: Filter?, title: String?): Task { + return create(filter?.valuesForNewTasks, title) + } + + /** + * Create task from the given content values, saving it. This version doesn't need to start with a + * base task model. + */ + private fun create(values: Map?, title: String?): Task { + val task = Task() + task.creationDate = DateUtilities.now() + task.modificationDate = DateUtilities.now() + if (title != null) { + task.title = title.trim { it <= ' ' } + } + task.uuid = UUIDHelper.newUUID() + task.priority = preferences.defaultPriority + task.dueDate = createDueDate( + preferences.getIntegerFromString(R.string.p_default_urgency_key, Task.URGENCY_NONE), + 0) + val setting = preferences.getIntegerFromString(R.string.p_default_hideUntil_key, Task.HIDE_UNTIL_NONE) + task.hideUntil = task.createHideUntil(setting, 0) + setDefaultReminders(preferences, task) + val tags = ArrayList() + if (values != null && values.isNotEmpty()) { + for (item in values.entries) { + val key = item.key + var value: Any? = item.value + when (key) { + Tag.KEY -> tags.add(value as String) + GoogleTask.KEY, CaldavTask.KEY, Place.KEY -> task.putTransitory(key, value!!) + else -> { + if (value is String) { + value = PermaSql.replacePlaceholdersForNewTask(value as String?) + } + when (key) { + "dueDate" -> task.dueDate = java.lang.Long.valueOf((value as String?)!!) + "importance" -> task.priority = Integer.valueOf((value as String?)!!) + else -> { + } + } + } + } + } + } + try { + parse(tagDataDao, task, tags) + } catch (e: Throwable) { + Timber.e(e) + } + task.setTags(tags) + return task + } + + fun createTags(task: Task) { + for (tag in task.tags) { + var tagData = tagDataDao.getTagByName(tag) + if (tagData == null) { + tagData = TagData() + tagData.name = tag + tagDataDao.createNew(tagData) + } + tagDao.insert(Tag(task, tagData)) + } + } + + companion object { + private fun setDefaultReminders(preferences: Preferences, task: Task) { + task.reminderPeriod = (DateUtilities.ONE_HOUR + * preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, 0)) + task.reminderFlags = preferences.defaultReminders or preferences.defaultRingMode + } + } +} \ No newline at end of file