diff --git a/app/src/androidTest/java/com/todoroo/astrid/sync/NewSyncTestCase.kt b/app/src/androidTest/java/com/todoroo/astrid/sync/NewSyncTestCase.kt index 576e6acf8..eee9e66f3 100644 --- a/app/src/androidTest/java/com/todoroo/astrid/sync/NewSyncTestCase.kt +++ b/app/src/androidTest/java/com/todoroo/astrid/sync/NewSyncTestCase.kt @@ -1,9 +1,9 @@ package com.todoroo.astrid.sync import com.todoroo.astrid.dao.TaskDao -import org.tasks.data.entity.Task -import org.tasks.data.entity.TagData import org.tasks.data.dao.TagDataDao +import org.tasks.data.entity.TagData +import org.tasks.data.entity.Task import org.tasks.injection.InjectingTestCase import javax.inject.Inject @@ -21,9 +21,8 @@ open class NewSyncTestCase : InjectingTestCase() { } suspend fun createTagData(): TagData { - val tag = TagData() - tag.name = "new tag" - tagDataDao.createNew(tag) + val tag = TagData(name = "new tag") + tagDataDao.insert(tag) return tag } diff --git a/app/src/androidTest/java/org/tasks/data/TagDataDaoTest.kt b/app/src/androidTest/java/org/tasks/data/TagDataDaoTest.kt index ea30d75ff..059ad8038 100644 --- a/app/src/androidTest/java/org/tasks/data/TagDataDaoTest.kt +++ b/app/src/androidTest/java/org/tasks/data/TagDataDaoTest.kt @@ -10,10 +10,9 @@ import org.junit.Assert.assertTrue import org.junit.Test import org.tasks.data.dao.TagDao import org.tasks.data.dao.TagDataDao +import org.tasks.data.entity.TagData import org.tasks.injection.InjectingTestCase import org.tasks.injection.ProductionModule -import org.tasks.makers.TagDataMaker.NAME -import org.tasks.makers.TagDataMaker.newTagData import org.tasks.makers.TagMaker.TAGDATA import org.tasks.makers.TagMaker.TAGUID import org.tasks.makers.TagMaker.TASK @@ -31,13 +30,13 @@ class TagDataDaoTest : InjectingTestCase() { @Test fun tagDataOrderedByNameIgnoresNullNames() = runBlocking { - tagDataDao.createNew(newTagData(with(NAME, null as String?))) + tagDataDao.insert(TagData(name = null)) assertTrue(tagDataDao.tagDataOrderedByName().isEmpty()) } @Test fun tagDataOrderedByNameIgnoresEmptyNames() = runBlocking { - tagDataDao.createNew(newTagData(with(NAME, ""))) + tagDataDao.insert(TagData(name = "")) assertTrue(tagDataDao.tagDataOrderedByName().isEmpty()) } @@ -48,20 +47,19 @@ class TagDataDaoTest : InjectingTestCase() { @Test fun getTagWithCaseFixesCase() = runBlocking { - tagDataDao.createNew(newTagData(with(NAME, "Derp"))) + tagDataDao.insert(TagData(name = "Derp")) assertEquals("Derp", tagDataDao.getTagWithCase("derp")) } @Test fun getTagsByName() = runBlocking { - val tagData = newTagData(with(NAME, "Derp")) - tagDataDao.createNew(tagData) + val tagData = TagData(name = "Derp").let { it.copy(id = tagDataDao.insert(it)) } assertEquals(listOf(tagData), tagDataDao.getTags(listOf("Derp"))) } @Test fun getTagsByNameCaseSensitive() = runBlocking { - tagDataDao.createNew(newTagData(with(NAME, "Derp"))) + tagDataDao.insert(TagData(name = "Derp")) assertTrue(tagDataDao.getTags(listOf("derp")).isEmpty()) } @@ -71,10 +69,8 @@ class TagDataDaoTest : InjectingTestCase() { val taskTwo = newTask() taskDao.createNew(taskOne) taskDao.createNew(taskTwo) - val tagOne = newTagData(with(NAME, "one")) - val tagTwo = newTagData(with(NAME, "two")) - tagDataDao.createNew(tagOne) - tagDataDao.createNew(tagTwo) + val tagOne = TagData(name = "one").let { it.copy(id = tagDataDao.insert(it)) } + val tagTwo = TagData(name = "two").let { it.copy(id = tagDataDao.insert(it)) } tagDao.insert(newTag(with(TAGDATA, tagOne), with(TASK, taskOne))) tagDao.insert(newTag(with(TAGDATA, tagTwo), with(TASK, taskTwo))) assertEquals(listOf(tagOne), tagDataDao.getTagDataForTask(taskOne.id)) @@ -83,8 +79,8 @@ class TagDataDaoTest : InjectingTestCase() { @Test fun getEmptyTagSelections() = runBlocking { val selections = tagDataDao.getTagSelections(listOf(1L)) - assertTrue(selections.first!!.isEmpty()) - assertTrue(selections.second!!.isEmpty()) + assertTrue(selections.first.isEmpty()) + assertTrue(selections.second.isEmpty()) } @Test @@ -99,7 +95,7 @@ class TagDataDaoTest : InjectingTestCase() { fun getEmptyPartialSelections() = runBlocking { newTag(1, "tag1") newTag(2, "tag1") - assertTrue(tagDataDao.getTagSelections(listOf(1L, 2L)).first!!.isEmpty()) + assertTrue(tagDataDao.getTagSelections(listOf(1L, 2L)).first.isEmpty()) } @Test @@ -113,15 +109,15 @@ class TagDataDaoTest : InjectingTestCase() { fun getEmptyCommonSelections() = runBlocking { newTag(1, "tag1") newTag(2, "tag2") - assertTrue(tagDataDao.getTagSelections(listOf(1L, 2L)).second!!.isEmpty()) + assertTrue(tagDataDao.getTagSelections(listOf(1L, 2L)).second.isEmpty()) } @Test fun getSelectionsWithNoTags() = runBlocking { newTag(1) val selections = tagDataDao.getTagSelections(listOf(1L)) - assertTrue(selections.first!!.isEmpty()) - assertTrue(selections.second!!.isEmpty()) + assertTrue(selections.first.isEmpty()) + assertTrue(selections.second.isEmpty()) } @Test @@ -130,7 +126,7 @@ class TagDataDaoTest : InjectingTestCase() { newTag(2) val selections = tagDataDao.getTagSelections(listOf(1L, 2L)) assertEquals(setOf("tag1"), selections.first) - assertTrue(selections.second!!.isEmpty()) + assertTrue(selections.second.isEmpty()) } private suspend fun newTag(taskId: Long, vararg tags: String) { diff --git a/app/src/androidTest/java/org/tasks/data/UpgraderDaoTests.kt b/app/src/androidTest/java/org/tasks/data/UpgraderDaoTests.kt index 4fe7bdd06..fce3cfd8f 100644 --- a/app/src/androidTest/java/org/tasks/data/UpgraderDaoTests.kt +++ b/app/src/androidTest/java/org/tasks/data/UpgraderDaoTests.kt @@ -13,9 +13,9 @@ import org.tasks.data.dao.TagDao import org.tasks.data.dao.TagDataDao import org.tasks.data.dao.UpgraderDao import org.tasks.data.entity.CaldavTask +import org.tasks.data.entity.TagData import org.tasks.injection.InjectingTestCase import org.tasks.injection.ProductionModule -import org.tasks.makers.TagDataMaker import org.tasks.makers.TagMaker import org.tasks.makers.TaskMaker import javax.inject.Inject @@ -34,10 +34,10 @@ class UpgraderDaoTests : InjectingTestCase() { fun getCaldavTasksWithTags() = runBlocking { val task = TaskMaker.newTask(MakeItEasy.with(TaskMaker.ID, 1L)) taskDao.createNew(task) - val one = TagDataMaker.newTagData() - val two = TagDataMaker.newTagData() - tagDataDao.createNew(one) - tagDataDao.createNew(two) + val one = TagData() + val two = TagData() + tagDataDao.insert(one) + tagDataDao.insert(two) tagDao.insert(TagMaker.newTag(MakeItEasy.with(TagMaker.TASK, task), MakeItEasy.with(TagMaker.TAGDATA, one))) tagDao.insert(TagMaker.newTag(MakeItEasy.with(TagMaker.TASK, task), MakeItEasy.with(TagMaker.TAGDATA, two))) caldavDao.insert(CaldavTask(task = task.id, calendar = "calendar")) @@ -48,8 +48,8 @@ class UpgraderDaoTests : InjectingTestCase() { fun ignoreNonCaldavTaskWithTags() = runBlocking { val task = TaskMaker.newTask(MakeItEasy.with(TaskMaker.ID, 1L)) taskDao.createNew(task) - val tag = TagDataMaker.newTagData() - tagDataDao.createNew(tag) + val tag = TagData() + tagDataDao.insert(tag) tagDao.insert(TagMaker.newTag(MakeItEasy.with(TagMaker.TASK, task), MakeItEasy.with(TagMaker.TAGDATA, tag))) assertTrue(upgraderDao.tasksWithTags().isEmpty()) } @@ -58,7 +58,7 @@ class UpgraderDaoTests : InjectingTestCase() { fun ignoreCaldavTaskWithoutTags() = runBlocking { val task = TaskMaker.newTask(MakeItEasy.with(TaskMaker.ID, 1L)) taskDao.createNew(task) - tagDataDao.createNew(TagDataMaker.newTagData()) + tagDataDao.insert(TagData()) caldavDao.insert(CaldavTask(task = task.id, calendar = "calendar")) assertTrue(upgraderDao.tasksWithTags().isEmpty()) } diff --git a/app/src/androidTest/java/org/tasks/opentasks/OpenTasksPropertiesTests.kt b/app/src/androidTest/java/org/tasks/opentasks/OpenTasksPropertiesTests.kt index ddba8bc87..7e68877d7 100644 --- a/app/src/androidTest/java/org/tasks/opentasks/OpenTasksPropertiesTests.kt +++ b/app/src/androidTest/java/org/tasks/opentasks/OpenTasksPropertiesTests.kt @@ -20,14 +20,13 @@ import org.tasks.data.dao.TagDao import org.tasks.data.dao.TagDataDao import org.tasks.data.entity.Alarm import org.tasks.data.entity.Alarm.Companion.TYPE_SNOOZE +import org.tasks.data.entity.TagData import org.tasks.data.entity.Task import org.tasks.injection.ProductionModule import org.tasks.makers.CaldavTaskMaker import org.tasks.makers.CaldavTaskMaker.CALENDAR import org.tasks.makers.CaldavTaskMaker.REMOTE_ID import org.tasks.makers.CaldavTaskMaker.newCaldavTask -import org.tasks.makers.TagDataMaker.NAME -import org.tasks.makers.TagDataMaker.newTagData import org.tasks.makers.TagMaker.TAGDATA import org.tasks.makers.TagMaker.TASK import org.tasks.makers.TagMaker.newTag @@ -93,8 +92,7 @@ class OpenTasksPropertiesTests : OpenTasksTest() { @Test fun matchExistingTag() = runBlocking { val (_, list) = withVtodo(ONE_TAG) - val tag = newTagData(with(NAME, "Tag1")) - tagDataDao.createNew(tag) + val tag = TagData(name = "Tag1").let { it.copy(id = tagDataDao.insert(it)) } synchronizer.sync() @@ -304,9 +302,9 @@ class OpenTasksPropertiesTests : OpenTasksTest() { } private suspend fun insertTag(task: Task, name: String) = - newTagData(with(NAME, name)) - .apply { tagDataDao.createNew(this) } - .let { tagDao.insert(newTag(with(TASK, task), with(TAGDATA, it))) } + TagData(name = name) + .apply { tagDataDao.insert(this) } + .let { tagDao.insert(newTag(with(TASK, task), with(TAGDATA, it))) } companion object { private val CHICAGO = TimeZone.getTimeZone("America/Chicago") diff --git a/app/src/main/java/com/todoroo/astrid/api/TagFilter.kt b/app/src/main/java/com/todoroo/astrid/api/TagFilter.kt index 179d3a7fc..60244ce47 100644 --- a/app/src/main/java/com/todoroo/astrid/api/TagFilter.kt +++ b/app/src/main/java/com/todoroo/astrid/api/TagFilter.kt @@ -1,15 +1,15 @@ package com.todoroo.astrid.api -import org.tasks.data.sql.Criterion.Companion.and -import org.tasks.data.sql.Join.Companion.inner -import org.tasks.data.sql.QueryTemplate import com.todoroo.andlib.utility.AndroidUtilities -import org.tasks.data.entity.Task import kotlinx.parcelize.Parcelize import org.tasks.data.NO_COUNT +import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible import org.tasks.data.entity.Tag import org.tasks.data.entity.TagData -import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible +import org.tasks.data.entity.Task +import org.tasks.data.sql.Criterion.Companion.and +import org.tasks.data.sql.Join.Companion.inner +import org.tasks.data.sql.QueryTemplate @Parcelize data class TagFilter( @@ -35,7 +35,7 @@ data class TagFilter( get() = tagData.getIcon()!! override val tint: Int - get() = tagData.getColor()!! + get() = tagData.color ?: 0 val uuid: String get() = tagData.remoteId!! diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt index 4ae24518b..326ad0b2b 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt @@ -199,12 +199,8 @@ class TaskCreator @Inject constructor( suspend 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) - } + val tagData = tagDataDao.getTagByName(tag) + ?: TagData(name = tag).also { tagDataDao.insert(it) } tagDao.insert(Tag(task, tagData)) } } diff --git a/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt b/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt index 125824be3..8214ff153 100644 --- a/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt +++ b/app/src/main/java/com/todoroo/astrid/service/Upgrader.kt @@ -18,21 +18,21 @@ import org.tasks.caldav.iCalendar import org.tasks.caldav.iCalendar.Companion.fromVtodo import org.tasks.caldav.iCalendar.Companion.order import org.tasks.caldav.iCalendar.Companion.parent -import org.tasks.data.dao.CaldavDao -import org.tasks.data.entity.CaldavTask import org.tasks.data.CaldavTaskContainer -import org.tasks.data.entity.Filter +import org.tasks.data.Location +import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.FilterDao import org.tasks.data.dao.GoogleTaskListDao -import org.tasks.data.Location import org.tasks.data.dao.LocationDao -import org.tasks.data.entity.Tag import org.tasks.data.dao.TagDao -import org.tasks.data.entity.TagData import org.tasks.data.dao.TagDataDao import org.tasks.data.dao.TaskAttachmentDao import org.tasks.data.dao.UpgraderDao import org.tasks.data.dao.UserActivityDao +import org.tasks.data.entity.CaldavTask +import org.tasks.data.entity.Filter +import org.tasks.data.entity.Tag +import org.tasks.data.entity.TagData import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.Preferences import org.tasks.time.DateTimeUtils2.currentTimeMillis @@ -151,8 +151,9 @@ class Upgrader @Inject constructor( ) } for (tagData in tagDataDao.getAll()) { - tagData.setColor(getAndroidColor(tagData.getColor()!!)) - tagDataDao.update(tagData) + tagDataDao.update( + tagData.copy(color = getAndroidColor(tagData.color ?: 0)) + ) } for (filter in filterDao.getFilters()) { filterDao.update( diff --git a/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt b/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt index a55d781ea..1e9045199 100644 --- a/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/TagSettingsActivity.kt @@ -16,14 +16,13 @@ import com.google.android.material.textfield.TextInputLayout import com.todoroo.astrid.activity.MainActivity import com.todoroo.astrid.activity.TaskListFragment import com.todoroo.astrid.api.TagFilter -import org.tasks.data.UUIDHelper import dagger.hilt.android.AndroidEntryPoint import org.tasks.LocalBroadcastManager import org.tasks.R import org.tasks.Strings.isNullOrEmpty import org.tasks.data.dao.TagDao -import org.tasks.data.entity.TagData import org.tasks.data.dao.TagDataDao +import org.tasks.data.entity.TagData import org.tasks.databinding.ActivityTagSettingsBinding import org.tasks.extensions.Context.hideKeyboard import org.tasks.themes.CustomIcons @@ -38,19 +37,17 @@ class TagSettingsActivity : BaseListSettingsActivity() { private lateinit var name: TextInputEditText private lateinit var nameLayout: TextInputLayout - private var isNewTag = false private lateinit var tagData: TagData + private val isNewTag: Boolean + get() = tagData.id == null + override val defaultIcon: Int = CustomIcons.LABEL override fun onCreate(savedInstanceState: Bundle?) { - tagData = intent.getParcelableExtra(EXTRA_TAG_DATA) - ?: TagData().apply { - isNewTag = true - remoteId = UUIDHelper.newUUID() - } + tagData = intent.getParcelableExtra(EXTRA_TAG_DATA) ?: TagData() super.onCreate(savedInstanceState) if (savedInstanceState == null) { - selectedColor = tagData.getColor()!! + selectedColor = tagData.color ?: 0 selectedIcon = tagData.getIcon()!! } name.setText(tagData.name) @@ -87,23 +84,37 @@ class TagSettingsActivity : BaseListSettingsActivity() { return } if (isNewTag) { - tagData.name = newName - tagData.setColor(selectedColor) - tagData.setIcon(selectedIcon) - tagDataDao.createNew(tagData) - localBroadcastManager.broadcastRefresh() - setResult(Activity.RESULT_OK, Intent().putExtra(MainActivity.OPEN_FILTER, TagFilter(tagData))) + tagData + .copy( + name = newName, + color = selectedColor, + icon = selectedIcon, + ) + .let { it.copy(id = tagDataDao.insert(it)) } + .let { + localBroadcastManager.broadcastRefresh() + setResult( + Activity.RESULT_OK, + Intent().putExtra(MainActivity.OPEN_FILTER, TagFilter(it)) + ) + } } else if (hasChanges()) { - tagData.name = newName - tagData.setColor(selectedColor) - tagData.setIcon(selectedIcon) - tagDataDao.update(tagData) - tagDao.rename(tagData.remoteId!!, newName) - localBroadcastManager.broadcastRefresh() - setResult( - Activity.RESULT_OK, - Intent(TaskListFragment.ACTION_RELOAD) - .putExtra(MainActivity.OPEN_FILTER, TagFilter(tagData))) + tagData + .copy( + name = newName, + color = selectedColor, + icon = selectedIcon, + ) + .let { + tagDataDao.update(it) + tagDao.rename(it.remoteId!!, newName) + localBroadcastManager.broadcastRefresh() + setResult( + Activity.RESULT_OK, + Intent(TaskListFragment.ACTION_RELOAD) + .putExtra(MainActivity.OPEN_FILTER, TagFilter(it)) + ) + } } finish() } @@ -112,7 +123,7 @@ class TagSettingsActivity : BaseListSettingsActivity() { return if (isNewTag) { selectedColor >= 0 || selectedIcon >= 0 || !isNullOrEmpty(newName) } else { - selectedColor != tagData.getColor() + selectedColor != (tagData.color ?: 0) || selectedIcon != tagData.getIcon() || newName != tagData.name } diff --git a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt index 3a47355ef..6413f0cb0 100644 --- a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt +++ b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt @@ -97,8 +97,9 @@ class TasksJsonImporter @Inject constructor( findTagData(tagData)?.let { return@forEach } - tagData.setColor(themeToColor(context, version, tagData.getColor()!!)) - tagDataDao.createNew(tagData) + tagDataDao.insert( + tagData.copy(color = themeToColor(context, version, tagData.color ?: 0)) + ) } backupContainer.googleTaskAccounts?.forEach { googleTaskAccount -> if (caldavDao.getAccount(TYPE_GOOGLE_TASKS, googleTaskAccount.account!!) == null) { diff --git a/app/src/main/java/org/tasks/caldav/iCalendar.kt b/app/src/main/java/org/tasks/caldav/iCalendar.kt index e5916a5e1..52d191fe6 100644 --- a/app/src/main/java/org/tasks/caldav/iCalendar.kt +++ b/app/src/main/java/org/tasks/caldav/iCalendar.kt @@ -133,9 +133,10 @@ class iCalendar @Inject constructor( val existing = tags.map(TagData::name) val toCreate = categories subtract existing for (name in toCreate) { - val tag = TagData(name) - tagDataDao.createNew(tag) - tags.add(tag) + tags.add( + TagData(name = name) + .let { it.copy(id = tagDataDao.insert(it)) } + ) } return tags } diff --git a/app/src/main/java/org/tasks/compose/edit/TagsRow.kt b/app/src/main/java/org/tasks/compose/edit/TagsRow.kt index e3e61cdc6..878e02fdc 100644 --- a/app/src/main/java/org/tasks/compose/edit/TagsRow.kt +++ b/app/src/main/java/org/tasks/compose/edit/TagsRow.kt @@ -38,7 +38,7 @@ fun TagsRow( R.drawable.ic_outline_label_24px ), name = tag.name, - theme = tag.getColor()!!, + theme = tag.color ?: 0, showText = true, showIcon = true, onClick = onClick, @@ -74,10 +74,11 @@ fun SingleTag() { MdcTheme { TagsRow( tags = listOf( - TagData("Home").apply { - setIcon(1062) - setColor(ColorProvider.BLUE_500) - } + TagData( + name = "Home", + icon = 1062, + color = ColorProvider.BLUE_500 + ) ), colorProvider = { it }, onClick = {}, @@ -92,11 +93,11 @@ fun BunchOfTags() { MdcTheme { TagsRow( tags = listOf( - TagData("One"), - TagData("Two"), - TagData("Three"), - TagData("Four"), - TagData("Five"), + TagData(name = "One"), + TagData(name = "Two"), + TagData(name = "Three"), + TagData(name = "Four"), + TagData(name = "Five"), ), colorProvider = { it }, onClick = {}, @@ -111,10 +112,11 @@ fun TagWithReallyLongName() { MdcTheme { TagsRow( tags = listOf( - TagData("This is a tag with a really really long name").apply { - setIcon(1062) - setColor(ColorProvider.BLUE_500) - } + TagData( + name = "This is a tag with a really really long name", + icon = 1062, + color = ColorProvider.BLUE_500 + ) ), colorProvider = { it }, onClick = {}, diff --git a/app/src/main/java/org/tasks/tags/TagPickerActivity.kt b/app/src/main/java/org/tasks/tags/TagPickerActivity.kt index 2b91e8ca3..61b6bf479 100644 --- a/app/src/main/java/org/tasks/tags/TagPickerActivity.kt +++ b/app/src/main/java/org/tasks/tags/TagPickerActivity.kt @@ -103,8 +103,8 @@ class TagPickerActivity : ThemedInjectingAppCompatActivity() { } /* handleBackPressed */ private fun getColor(tagData: TagData): Color { - if (tagData.getColor() != 0) { - val themeColor = colorProvider.getThemeColor(tagData.getColor()!!, true) + if ((tagData.color ?: 0) != 0) { + val themeColor = colorProvider.getThemeColor(tagData.color ?: 0, true) if (inventory.purchasedThemes() || themeColor.isFree) { return Color(themeColor.primaryColor) } diff --git a/app/src/main/java/org/tasks/tags/TagPickerViewModel.kt b/app/src/main/java/org/tasks/tags/TagPickerViewModel.kt index d1efcefef..377c62e4b 100644 --- a/app/src/main/java/org/tasks/tags/TagPickerViewModel.kt +++ b/app/src/main/java/org/tasks/tags/TagPickerViewModel.kt @@ -9,8 +9,8 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import org.tasks.data.entity.TagData import org.tasks.data.dao.TagDataDao +import org.tasks.data.entity.TagData import org.tasks.data.searchTags import javax.inject.Inject @@ -90,8 +90,8 @@ class TagPickerViewModel @Inject constructor( suspend fun toggle(tagData: TagData, checked: Boolean): ToggleableState { var tagData = tagData if (tagData.id == null) { - tagData = TagData(tagData.name) - tagDataDao.createNew(tagData) + tagData = TagData(name = tagData.name) + .let { it.copy(id = tagDataDao.insert(it)) } } partiallySelected.remove(tagData) return if (checked) { @@ -104,9 +104,10 @@ class TagPickerViewModel @Inject constructor( } suspend fun createNew(name: String) { - val tagData = TagData(name) - tagDataDao.createNew(tagData) - selected.add(tagData) + selected.add( + TagData(name = name) + .let { it.copy(id = tagDataDao.insert(it)) } + ) search("") } } \ No newline at end of file diff --git a/app/src/test/java/org/tasks/makers/TagDataMaker.kt b/app/src/test/java/org/tasks/makers/TagDataMaker.kt deleted file mode 100644 index e5bf93c83..000000000 --- a/app/src/test/java/org/tasks/makers/TagDataMaker.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.tasks.makers - -import com.natpryce.makeiteasy.Instantiator -import com.natpryce.makeiteasy.Property -import com.natpryce.makeiteasy.Property.newProperty -import com.natpryce.makeiteasy.PropertyLookup -import com.natpryce.makeiteasy.PropertyValue -import org.tasks.data.entity.TagData -import org.tasks.makers.Maker.make - -object TagDataMaker { - val NAME: Property = newProperty() - val UID: Property = newProperty() - - private val instantiator = Instantiator { lookup: PropertyLookup -> - val tagData = TagData() - tagData.name = lookup.valueOf(NAME, "tag") - tagData.remoteId = lookup.valueOf(UID, null as String?) - tagData - } - - fun newTagData(vararg properties: PropertyValue): TagData { - return make(instantiator, *properties) - } -} \ No newline at end of file diff --git a/app/src/test/java/org/tasks/sync/microsoft/ConvertToMicrosoftTests.kt b/app/src/test/java/org/tasks/sync/microsoft/ConvertToMicrosoftTests.kt index cabcf2d65..60e57f1f2 100644 --- a/app/src/test/java/org/tasks/sync/microsoft/ConvertToMicrosoftTests.kt +++ b/app/src/test/java/org/tasks/sync/microsoft/ConvertToMicrosoftTests.kt @@ -1,7 +1,6 @@ package org.tasks.sync.microsoft import com.natpryce.makeiteasy.MakeItEasy.with -import org.tasks.data.entity.Task import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Assert.assertTrue @@ -9,10 +8,10 @@ import org.junit.Test import org.tasks.Freeze.Companion.freezeAt import org.tasks.TestUtilities.withTZ import org.tasks.data.entity.CaldavTask +import org.tasks.data.entity.TagData +import org.tasks.data.entity.Task import org.tasks.makers.CaldavTaskMaker.REMOTE_ID import org.tasks.makers.CaldavTaskMaker.newCaldavTask -import org.tasks.makers.TagDataMaker.NAME -import org.tasks.makers.TagDataMaker.newTagData import org.tasks.makers.TaskMaker.COMPLETION_TIME import org.tasks.makers.TaskMaker.DESCRIPTION import org.tasks.makers.TaskMaker.DUE_TIME @@ -100,8 +99,8 @@ class ConvertToMicrosoftTests { val remote = newTask().toRemote( newCaldavTask(), listOf( - newTagData(with(NAME, "tag1")), - newTagData(with(NAME, "tag2")), + TagData(name = "tag1"), + TagData(name = "tag2"), ) ) assertEquals(listOf("tag1", "tag2"), remote.categories) diff --git a/data/src/main/kotlin/org/tasks/data/dao/TagDataDao.kt b/data/src/main/kotlin/org/tasks/data/dao/TagDataDao.kt index a3616b38b..36f371a64 100644 --- a/data/src/main/kotlin/org/tasks/data/dao/TagDataDao.kt +++ b/data/src/main/kotlin/org/tasks/data/dao/TagDataDao.kt @@ -9,7 +9,6 @@ import androidx.room.Update import kotlinx.coroutines.flow.Flow import org.tasks.data.NO_ORDER import org.tasks.data.TagFilters -import org.tasks.data.UUIDHelper import org.tasks.data.db.DbUtils import org.tasks.data.entity.Tag import org.tasks.data.entity.TagData @@ -130,13 +129,6 @@ abstract class TagDataDao { @Insert abstract suspend fun insert(tags: Iterable) - suspend fun createNew(tag: TagData) { - if (Task.isUuidEmpty(tag.remoteId)) { - tag.remoteId = UUIDHelper.newUUID() - } - tag.id = insert(tag) - } - @Query("SELECT tagdata.*, COUNT(tasks._id) AS count" + " FROM tagdata" + " LEFT JOIN tags ON tags.tag_uid = tagdata.remoteId" diff --git a/data/src/main/kotlin/org/tasks/data/entity/TagData.kt b/data/src/main/kotlin/org/tasks/data/entity/TagData.kt index d6c2c993d..5dd7b74b0 100644 --- a/data/src/main/kotlin/org/tasks/data/entity/TagData.kt +++ b/data/src/main/kotlin/org/tasks/data/entity/TagData.kt @@ -1,126 +1,37 @@ package org.tasks.data.entity -import android.annotation.SuppressLint -import android.os.Parcel import android.os.Parcelable import androidx.room.ColumnInfo import androidx.room.Entity -import androidx.room.Ignore import androidx.room.PrimaryKey +import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import org.tasks.data.LABEL import org.tasks.data.NO_ORDER +import org.tasks.data.UUIDHelper +@Parcelize @Serializable @Entity(tableName = "tagdata") -class TagData : Parcelable { +data class TagData( @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "_id") @Transient - var id: Long? = null - + val id: Long? = null, @ColumnInfo(name = "remoteId") - var remoteId: String? = Task.NO_UUID - + val remoteId: String? = UUIDHelper.newUUID(), @ColumnInfo(name = "name") - var name: String? = "" - + val name: String? = "", @ColumnInfo(name = "color") - private var color: Int? = 0 - + val color: Int? = 0, @ColumnInfo(name = "tagOrdering") - var tagOrdering: String? = "[]" - + val tagOrdering: String? = "[]", @ColumnInfo(name = "td_icon") - private var icon: Int? = -1 - + private val icon: Int? = -1, @ColumnInfo(name = "td_order") - var order = NO_ORDER - - @Ignore - constructor(name: String?) { - this.name = name - } - - constructor() - - @SuppressLint("ParcelClassLoader") - @Ignore - private constructor(parcel: Parcel) { - with(parcel) { - id = readValue(null) as Long? - remoteId = readString() - name = readString() - color = readInt() - tagOrdering = readString() - icon = readInt() - order = readInt() - } - } - - @Suppress("RedundantNullableReturnType") - fun getColor(): Int? = color ?: 0 - - fun setColor(color: Int?) { - this.color = color - } - + val order: Int = NO_ORDER, +) : Parcelable { @Suppress("RedundantNullableReturnType") fun getIcon(): Int? = icon ?: LABEL - - fun setIcon(icon: Int?) { - this.icon = icon - } - - override fun describeContents() = 0 - - override fun writeToParcel(dest: Parcel, flags: Int) { - with(dest) { - writeValue(id) - writeString(remoteId) - writeString(name) - writeInt(color!!) - writeString(tagOrdering) - writeInt(getIcon()!!) - writeInt(order) - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is TagData) return false - - if (id != other.id) return false - if (remoteId != other.remoteId) return false - if (name != other.name) return false - if (color != other.color) return false - if (tagOrdering != other.tagOrdering) return false - if (icon != other.icon) return false - if (order != other.order) return false - - return true - } - - override fun hashCode(): Int { - var result = id?.hashCode() ?: 0 - result = 31 * result + (remoteId?.hashCode() ?: 0) - result = 31 * result + (name?.hashCode() ?: 0) - result = 31 * result + (color ?: 0) - result = 31 * result + (tagOrdering?.hashCode() ?: 0) - result = 31 * result + (icon ?: 0) - result = 31 * result + order - return result - } - - override fun toString(): String = - "TagData(id=$id, remoteId=$remoteId, name=$name, color=$color, tagOrdering=$tagOrdering, icon=$icon, order=$order)" - - companion object { - @JvmField val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): TagData = TagData(source) - - override fun newArray(size: Int): Array = arrayOfNulls(size) - } - } -} \ No newline at end of file +}