Skip to content
This repository was archived by the owner on May 26, 2026. It is now read-only.

Commit 18c58e9

Browse files
authored
Extract status field builders from DmfsTaskBuilder (#364)
* Extract status field builders from DmfsTaskBuilder Extract PriorityBuilder, ClassificationBuilder, StatusBuilder, CompletedBuilder, and PercentCompleteBuilder from the inline code in DmfsTaskBuilder.buildTask(). # Conflicts: # lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/DmfsTaskBuilder.kt * Remove duplicate TitleBuilder from fieldBuilders array
1 parent 8c2df1f commit 18c58e9

16 files changed

Lines changed: 460 additions & 37 deletions

lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemBuilder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import android.content.Entity
1111
import at.bitfire.synctools.icalendar.AssociatedComponents
1212
import at.bitfire.synctools.mapping.jtx.builder.CollectionIdBuilder
1313
import at.bitfire.synctools.mapping.jtx.builder.DescriptionBuilder
14-
import at.bitfire.synctools.mapping.jtx.builder.RecurrenceFieldsBuilder
1514
import at.bitfire.synctools.mapping.jtx.builder.JtxEntityBuilder
15+
import at.bitfire.synctools.mapping.jtx.builder.RecurrenceFieldsBuilder
1616
import at.bitfire.synctools.mapping.jtx.builder.SyncPropertiesBuilder
1717
import at.bitfire.synctools.storage.jtx.JtxItemAndExceptions
1818
import net.fortuna.ical4j.model.component.CalendarComponent

lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/builder/JtxEntityBuilder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
package at.bitfire.synctools.mapping.jtx.builder
88

99
import android.content.Entity
10+
import at.bitfire.synctools.exception.InvalidICalendarException
1011
import net.fortuna.ical4j.model.component.CalendarComponent
1112
import net.fortuna.ical4j.model.component.VJournal
1213
import net.fortuna.ical4j.model.component.VToDo
13-
import at.bitfire.synctools.exception.InvalidICalendarException
1414

1515
interface JtxEntityBuilder {
1616

lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/DmfsTaskBuilder.kt

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import android.content.Entity
1111
import at.bitfire.ical4android.Task
1212
import at.bitfire.ical4android.UnknownProperty
1313
import at.bitfire.synctools.mapping.tasks.builder.AllDayBuilder
14+
import at.bitfire.synctools.mapping.tasks.builder.ClassificationBuilder
1415
import at.bitfire.synctools.mapping.tasks.builder.ColorBuilder
16+
import at.bitfire.synctools.mapping.tasks.builder.CompletedBuilder
1517
import at.bitfire.synctools.mapping.tasks.builder.DescriptionBuilder
1618
import at.bitfire.synctools.mapping.tasks.builder.DirtyBuilder
1719
import at.bitfire.synctools.mapping.tasks.builder.DmfsTaskFieldBuilder
@@ -21,9 +23,12 @@ import at.bitfire.synctools.mapping.tasks.builder.ETagBuilder
2123
import at.bitfire.synctools.mapping.tasks.builder.GeoBuilder
2224
import at.bitfire.synctools.mapping.tasks.builder.LocationBuilder
2325
import at.bitfire.synctools.mapping.tasks.builder.OrganizerBuilder
26+
import at.bitfire.synctools.mapping.tasks.builder.PercentCompleteBuilder
27+
import at.bitfire.synctools.mapping.tasks.builder.PriorityBuilder
2428
import at.bitfire.synctools.mapping.tasks.builder.RecurrenceFieldsBuilder
2529
import at.bitfire.synctools.mapping.tasks.builder.SequenceBuilder
2630
import at.bitfire.synctools.mapping.tasks.builder.StartTimeBuilder
31+
import at.bitfire.synctools.mapping.tasks.builder.StatusBuilder
2732
import at.bitfire.synctools.mapping.tasks.builder.SyncFlagsBuilder
2833
import at.bitfire.synctools.mapping.tasks.builder.SyncIdBuilder
2934
import at.bitfire.synctools.mapping.tasks.builder.TitleBuilder
@@ -40,8 +45,6 @@ import net.fortuna.ical4j.model.parameter.RelType
4045
import net.fortuna.ical4j.model.parameter.Related
4146
import net.fortuna.ical4j.model.property.Action
4247
import net.fortuna.ical4j.model.property.immutable.ImmutableAction
43-
import net.fortuna.ical4j.model.property.immutable.ImmutableClazz
44-
import net.fortuna.ical4j.model.property.immutable.ImmutableStatus
4548
import org.dmfs.tasks.contract.TaskContract.Properties
4649
import org.dmfs.tasks.contract.TaskContract.Property.Alarm
4750
import org.dmfs.tasks.contract.TaskContract.Property.Category
@@ -76,6 +79,12 @@ class DmfsTaskBuilder(
7679
SyncFlagsBuilder(flags),
7780
SequenceBuilder(),
7881
DirtyBuilder(),
82+
// status fields
83+
PriorityBuilder(),
84+
ClassificationBuilder(),
85+
StatusBuilder(),
86+
CompletedBuilder(),
87+
PercentCompleteBuilder(),
7988
// content fields
8089
TitleBuilder(),
8190
DescriptionBuilder(),
@@ -90,7 +99,6 @@ class DmfsTaskBuilder(
9099
DueBuilder(),
91100
DurationBuilder(),
92101
RecurrenceFieldsBuilder(),
93-
// status (still inline below)
94102
// property sub-rows (still inline below via insertProperties)
95103
)
96104

@@ -128,30 +136,6 @@ class DmfsTaskBuilder(
128136
// parent_id will be re-calculated when the relation row is inserted (if there is any)
129137
.withValue(Tasks.PARENT_ID, null)
130138

131-
// Priority, classification
132-
builder
133-
.withValue(Tasks.PRIORITY, task.priority)
134-
.withValue(Tasks.CLASSIFICATION, when (task.classification?.value?.uppercase()) {
135-
ImmutableClazz.VALUE_PUBLIC -> Tasks.CLASSIFICATION_PUBLIC
136-
ImmutableClazz.VALUE_CONFIDENTIAL -> Tasks.CLASSIFICATION_CONFIDENTIAL
137-
null -> Tasks.CLASSIFICATION_DEFAULT
138-
else -> Tasks.CLASSIFICATION_PRIVATE // all unknown classifications MUST be treated as PRIVATE
139-
})
140-
141-
// COMPLETED must always be a DATE-TIME
142-
builder
143-
.withValue(Tasks.COMPLETED, task.completedAt?.date?.toEpochMilli())
144-
.withValue(Tasks.COMPLETED_IS_ALLDAY, 0)
145-
.withValue(Tasks.PERCENT_COMPLETE, task.percentComplete)
146-
147-
// Status
148-
val status = when (task.status?.value) {
149-
ImmutableStatus.VALUE_IN_PROCESS -> Tasks.STATUS_IN_PROCESS
150-
ImmutableStatus.VALUE_COMPLETED -> Tasks.STATUS_COMPLETED
151-
ImmutableStatus.VALUE_CANCELLED -> Tasks.STATUS_CANCELLED
152-
else -> Tasks.STATUS_DEFAULT // == Tasks.STATUS_NEEDS_ACTION
153-
}
154-
builder.withValue(Tasks.STATUS, status)
155139
builder
156140
.withValue(Tasks.CREATED, task.createdAt)
157141
.withValue(Tasks.LAST_MODIFIED, task.lastModified)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* This file is part of bitfireAT/synctools which is released under GPLv3.
3+
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
4+
* SPDX-License-Identifier: GPL-3.0-or-later
5+
*/
6+
7+
package at.bitfire.synctools.mapping.tasks.builder
8+
9+
import android.content.Entity
10+
import at.bitfire.ical4android.Task
11+
import net.fortuna.ical4j.model.property.immutable.ImmutableClazz
12+
import org.dmfs.tasks.contract.TaskContract.Tasks
13+
14+
class ClassificationBuilder : DmfsTaskFieldBuilder {
15+
16+
override fun build(from: Task, to: Entity) {
17+
to.entityValues.put(Tasks.CLASSIFICATION, when (from.classification?.value?.uppercase()) {
18+
ImmutableClazz.VALUE_PUBLIC -> Tasks.CLASSIFICATION_PUBLIC
19+
ImmutableClazz.VALUE_CONFIDENTIAL -> Tasks.CLASSIFICATION_CONFIDENTIAL
20+
null -> Tasks.CLASSIFICATION_DEFAULT
21+
else -> Tasks.CLASSIFICATION_PRIVATE // all unknown classifications MUST be treated as PRIVATE
22+
})
23+
}
24+
25+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* This file is part of bitfireAT/synctools which is released under GPLv3.
3+
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
4+
* SPDX-License-Identifier: GPL-3.0-or-later
5+
*/
6+
7+
package at.bitfire.synctools.mapping.tasks.builder
8+
9+
import android.content.Entity
10+
import at.bitfire.ical4android.Task
11+
import org.dmfs.tasks.contract.TaskContract.Tasks
12+
13+
class CompletedBuilder : DmfsTaskFieldBuilder {
14+
15+
override fun build(from: Task, to: Entity) {
16+
// COMPLETED must always be a DATE-TIME
17+
to.entityValues.put(Tasks.COMPLETED, from.completedAt?.date?.toEpochMilli())
18+
to.entityValues.put(Tasks.COMPLETED_IS_ALLDAY, 0)
19+
}
20+
21+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* This file is part of bitfireAT/synctools which is released under GPLv3.
3+
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
4+
* SPDX-License-Identifier: GPL-3.0-or-later
5+
*/
6+
7+
package at.bitfire.synctools.mapping.tasks.builder
8+
9+
import android.content.Entity
10+
import at.bitfire.ical4android.Task
11+
import org.dmfs.tasks.contract.TaskContract.Tasks
12+
13+
class PercentCompleteBuilder : DmfsTaskFieldBuilder {
14+
15+
override fun build(from: Task, to: Entity) {
16+
to.entityValues.put(Tasks.PERCENT_COMPLETE, from.percentComplete)
17+
}
18+
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* This file is part of bitfireAT/synctools which is released under GPLv3.
3+
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
4+
* SPDX-License-Identifier: GPL-3.0-or-later
5+
*/
6+
7+
package at.bitfire.synctools.mapping.tasks.builder
8+
9+
import android.content.Entity
10+
import at.bitfire.ical4android.Task
11+
import org.dmfs.tasks.contract.TaskContract.Tasks
12+
13+
class PriorityBuilder : DmfsTaskFieldBuilder {
14+
15+
override fun build(from: Task, to: Entity) {
16+
to.entityValues.put(Tasks.PRIORITY, from.priority)
17+
}
18+
19+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* This file is part of bitfireAT/synctools which is released under GPLv3.
3+
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
4+
* SPDX-License-Identifier: GPL-3.0-or-later
5+
*/
6+
7+
package at.bitfire.synctools.mapping.tasks.builder
8+
9+
import android.content.Entity
10+
import at.bitfire.ical4android.Task
11+
import net.fortuna.ical4j.model.property.immutable.ImmutableStatus
12+
import org.dmfs.tasks.contract.TaskContract.Tasks
13+
14+
class StatusBuilder : DmfsTaskFieldBuilder {
15+
16+
override fun build(from: Task, to: Entity) {
17+
to.entityValues.put(Tasks.STATUS, when (from.status?.value) {
18+
ImmutableStatus.VALUE_IN_PROCESS -> Tasks.STATUS_IN_PROCESS
19+
ImmutableStatus.VALUE_COMPLETED -> Tasks.STATUS_COMPLETED
20+
ImmutableStatus.VALUE_CANCELLED -> Tasks.STATUS_CANCELLED
21+
else -> Tasks.STATUS_DEFAULT // == Tasks.STATUS_NEEDS_ACTION
22+
})
23+
}
24+
25+
}

lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemHandlerTest.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,18 @@ package at.bitfire.synctools.mapping.jtx
88

99
import android.content.Entity
1010
import androidx.core.content.contentValuesOf
11-
import net.fortuna.ical4j.model.property.ProdId
12-
import org.junit.Test
13-
import org.junit.runner.RunWith
14-
import org.robolectric.RobolectricTestRunner
15-
1611
import at.bitfire.synctools.storage.jtx.JtxItemAndExceptions
1712
import at.techbee.jtx.JtxContract
1813
import net.fortuna.ical4j.model.component.VJournal
1914
import net.fortuna.ical4j.model.component.VToDo
15+
import net.fortuna.ical4j.model.property.ProdId
2016
import org.junit.Assert.assertEquals
2117
import org.junit.Assert.assertFalse
2218
import org.junit.Assert.assertNotNull
2319
import org.junit.Assert.assertTrue
24-
import kotlin.jvm.optionals.getOrNull
20+
import org.junit.Test
21+
import org.junit.runner.RunWith
22+
import org.robolectric.RobolectricTestRunner
2523

2624
@RunWith(RobolectricTestRunner::class)
2725
class JtxItemHandlerTest {

lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/builder/DirtyAndDeletedBuilderTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import android.content.ContentValues
1010
import android.content.Entity
1111
import at.techbee.jtx.JtxContract
1212
import net.fortuna.ical4j.model.component.VJournal
13-
import org.junit.Assert.*
13+
import org.junit.Assert.assertEquals
1414
import org.junit.Test
1515
import org.junit.runner.RunWith
1616
import org.robolectric.RobolectricTestRunner

0 commit comments

Comments
 (0)