Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import android.content.Entity
import at.bitfire.synctools.icalendar.AssociatedComponents
import at.bitfire.synctools.mapping.jtx.builder.CollectionIdBuilder
import at.bitfire.synctools.mapping.jtx.builder.DescriptionBuilder
import at.bitfire.synctools.mapping.jtx.builder.RecurrenceFieldsBuilder
import at.bitfire.synctools.mapping.jtx.builder.JtxEntityBuilder
import at.bitfire.synctools.mapping.jtx.builder.RecurrenceFieldsBuilder
import at.bitfire.synctools.mapping.jtx.builder.SyncPropertiesBuilder
import at.bitfire.synctools.storage.jtx.JtxItemAndExceptions
import net.fortuna.ical4j.model.component.CalendarComponent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
package at.bitfire.synctools.mapping.jtx.builder

import android.content.Entity
import at.bitfire.synctools.exception.InvalidICalendarException
import net.fortuna.ical4j.model.component.CalendarComponent
import net.fortuna.ical4j.model.component.VJournal
import net.fortuna.ical4j.model.component.VToDo
import at.bitfire.synctools.exception.InvalidICalendarException

interface JtxEntityBuilder {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ import android.content.Entity
import at.bitfire.ical4android.Task
import at.bitfire.ical4android.UnknownProperty
import at.bitfire.synctools.mapping.tasks.builder.AllDayBuilder
import at.bitfire.synctools.mapping.tasks.builder.ClassificationBuilder
import at.bitfire.synctools.mapping.tasks.builder.ColorBuilder
import at.bitfire.synctools.mapping.tasks.builder.CompletedBuilder
import at.bitfire.synctools.mapping.tasks.builder.DescriptionBuilder
import at.bitfire.synctools.mapping.tasks.builder.DirtyBuilder
import at.bitfire.synctools.mapping.tasks.builder.DmfsTaskFieldBuilder
Expand All @@ -21,9 +23,12 @@ import at.bitfire.synctools.mapping.tasks.builder.ETagBuilder
import at.bitfire.synctools.mapping.tasks.builder.GeoBuilder
import at.bitfire.synctools.mapping.tasks.builder.LocationBuilder
import at.bitfire.synctools.mapping.tasks.builder.OrganizerBuilder
import at.bitfire.synctools.mapping.tasks.builder.PercentCompleteBuilder
import at.bitfire.synctools.mapping.tasks.builder.PriorityBuilder
import at.bitfire.synctools.mapping.tasks.builder.RecurrenceFieldsBuilder
import at.bitfire.synctools.mapping.tasks.builder.SequenceBuilder
import at.bitfire.synctools.mapping.tasks.builder.StartTimeBuilder
import at.bitfire.synctools.mapping.tasks.builder.StatusBuilder
import at.bitfire.synctools.mapping.tasks.builder.SyncFlagsBuilder
import at.bitfire.synctools.mapping.tasks.builder.SyncIdBuilder
import at.bitfire.synctools.mapping.tasks.builder.TitleBuilder
Expand All @@ -40,8 +45,6 @@ import net.fortuna.ical4j.model.parameter.RelType
import net.fortuna.ical4j.model.parameter.Related
import net.fortuna.ical4j.model.property.Action
import net.fortuna.ical4j.model.property.immutable.ImmutableAction
import net.fortuna.ical4j.model.property.immutable.ImmutableClazz
import net.fortuna.ical4j.model.property.immutable.ImmutableStatus
import org.dmfs.tasks.contract.TaskContract.Properties
import org.dmfs.tasks.contract.TaskContract.Property.Alarm
import org.dmfs.tasks.contract.TaskContract.Property.Category
Expand Down Expand Up @@ -76,6 +79,12 @@ class DmfsTaskBuilder(
SyncFlagsBuilder(flags),
SequenceBuilder(),
DirtyBuilder(),
// status fields
PriorityBuilder(),
ClassificationBuilder(),
StatusBuilder(),
CompletedBuilder(),
PercentCompleteBuilder(),
// content fields
TitleBuilder(),
DescriptionBuilder(),
Expand All @@ -90,7 +99,6 @@ class DmfsTaskBuilder(
DueBuilder(),
DurationBuilder(),
RecurrenceFieldsBuilder(),
// status (still inline below)
// property sub-rows (still inline below via insertProperties)
)

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

// Priority, classification
builder
.withValue(Tasks.PRIORITY, task.priority)
.withValue(Tasks.CLASSIFICATION, when (task.classification?.value?.uppercase()) {
ImmutableClazz.VALUE_PUBLIC -> Tasks.CLASSIFICATION_PUBLIC
ImmutableClazz.VALUE_CONFIDENTIAL -> Tasks.CLASSIFICATION_CONFIDENTIAL
null -> Tasks.CLASSIFICATION_DEFAULT
else -> Tasks.CLASSIFICATION_PRIVATE // all unknown classifications MUST be treated as PRIVATE
})

// COMPLETED must always be a DATE-TIME
builder
.withValue(Tasks.COMPLETED, task.completedAt?.date?.toEpochMilli())
.withValue(Tasks.COMPLETED_IS_ALLDAY, 0)
.withValue(Tasks.PERCENT_COMPLETE, task.percentComplete)

// Status
val status = when (task.status?.value) {
ImmutableStatus.VALUE_IN_PROCESS -> Tasks.STATUS_IN_PROCESS
ImmutableStatus.VALUE_COMPLETED -> Tasks.STATUS_COMPLETED
ImmutableStatus.VALUE_CANCELLED -> Tasks.STATUS_CANCELLED
else -> Tasks.STATUS_DEFAULT // == Tasks.STATUS_NEEDS_ACTION
}
builder.withValue(Tasks.STATUS, status)
builder
.withValue(Tasks.CREATED, task.createdAt)
.withValue(Tasks.LAST_MODIFIED, task.lastModified)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* This file is part of bitfireAT/synctools which is released under GPLv3.
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package at.bitfire.synctools.mapping.tasks.builder

import android.content.Entity
import at.bitfire.ical4android.Task
import net.fortuna.ical4j.model.property.immutable.ImmutableClazz
import org.dmfs.tasks.contract.TaskContract.Tasks

class ClassificationBuilder : DmfsTaskFieldBuilder {

override fun build(from: Task, to: Entity) {
Comment thread
sunkup marked this conversation as resolved.
to.entityValues.put(Tasks.CLASSIFICATION, when (from.classification?.value?.uppercase()) {
ImmutableClazz.VALUE_PUBLIC -> Tasks.CLASSIFICATION_PUBLIC
ImmutableClazz.VALUE_CONFIDENTIAL -> Tasks.CLASSIFICATION_CONFIDENTIAL
null -> Tasks.CLASSIFICATION_DEFAULT
else -> Tasks.CLASSIFICATION_PRIVATE // all unknown classifications MUST be treated as PRIVATE
})
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* This file is part of bitfireAT/synctools which is released under GPLv3.
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package at.bitfire.synctools.mapping.tasks.builder

import android.content.Entity
import at.bitfire.ical4android.Task
import org.dmfs.tasks.contract.TaskContract.Tasks

class CompletedBuilder : DmfsTaskFieldBuilder {

override fun build(from: Task, to: Entity) {
// COMPLETED must always be a DATE-TIME
to.entityValues.put(Tasks.COMPLETED, from.completedAt?.date?.toEpochMilli())
to.entityValues.put(Tasks.COMPLETED_IS_ALLDAY, 0)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* This file is part of bitfireAT/synctools which is released under GPLv3.
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package at.bitfire.synctools.mapping.tasks.builder

import android.content.Entity
import at.bitfire.ical4android.Task
import org.dmfs.tasks.contract.TaskContract.Tasks

class PercentCompleteBuilder : DmfsTaskFieldBuilder {

override fun build(from: Task, to: Entity) {
to.entityValues.put(Tasks.PERCENT_COMPLETE, from.percentComplete)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* This file is part of bitfireAT/synctools which is released under GPLv3.
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package at.bitfire.synctools.mapping.tasks.builder

import android.content.Entity
import at.bitfire.ical4android.Task
import org.dmfs.tasks.contract.TaskContract.Tasks

class PriorityBuilder : DmfsTaskFieldBuilder {

override fun build(from: Task, to: Entity) {
to.entityValues.put(Tasks.PRIORITY, from.priority)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* This file is part of bitfireAT/synctools which is released under GPLv3.
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package at.bitfire.synctools.mapping.tasks.builder

import android.content.Entity
import at.bitfire.ical4android.Task
import net.fortuna.ical4j.model.property.immutable.ImmutableStatus
import org.dmfs.tasks.contract.TaskContract.Tasks

class StatusBuilder : DmfsTaskFieldBuilder {

override fun build(from: Task, to: Entity) {
to.entityValues.put(Tasks.STATUS, when (from.status?.value) {
ImmutableStatus.VALUE_IN_PROCESS -> Tasks.STATUS_IN_PROCESS
ImmutableStatus.VALUE_COMPLETED -> Tasks.STATUS_COMPLETED
ImmutableStatus.VALUE_CANCELLED -> Tasks.STATUS_CANCELLED
else -> Tasks.STATUS_DEFAULT // == Tasks.STATUS_NEEDS_ACTION
})
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,18 @@ package at.bitfire.synctools.mapping.jtx

import android.content.Entity
import androidx.core.content.contentValuesOf
import net.fortuna.ical4j.model.property.ProdId
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner

import at.bitfire.synctools.storage.jtx.JtxItemAndExceptions
import at.techbee.jtx.JtxContract
import net.fortuna.ical4j.model.component.VJournal
import net.fortuna.ical4j.model.component.VToDo
import net.fortuna.ical4j.model.property.ProdId
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import kotlin.jvm.optionals.getOrNull
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner

@RunWith(RobolectricTestRunner::class)
class JtxItemHandlerTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import android.content.ContentValues
import android.content.Entity
import at.techbee.jtx.JtxContract
import net.fortuna.ical4j.model.component.VJournal
import org.junit.Assert.*
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import at.bitfire.synctools.icalendar.plusAssign
import at.bitfire.synctools.test.assertContentValuesEqual
import at.techbee.jtx.JtxContract
import net.fortuna.ical4j.model.DateList
import net.fortuna.ical4j.model.ParameterList
import net.fortuna.ical4j.model.Period
import net.fortuna.ical4j.model.TimeZoneRegistryFactory
import net.fortuna.ical4j.model.component.VToDo
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* This file is part of bitfireAT/synctools which is released under GPLv3.
* Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details.
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package at.bitfire.synctools.mapping.tasks.builder

import android.content.ContentValues
import android.content.Entity
import androidx.core.content.contentValuesOf
import at.bitfire.ical4android.Task
import at.bitfire.synctools.test.assertContentValuesEqual
import net.fortuna.ical4j.model.property.Clazz
import net.fortuna.ical4j.model.property.immutable.ImmutableClazz
import org.dmfs.tasks.contract.TaskContract.Tasks
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner

@RunWith(RobolectricTestRunner::class)
class ClassificationBuilderTest {

private val builder = ClassificationBuilder()

@Test
fun `No CLASS defaults to DEFAULT`() {
val result = Entity(ContentValues())
builder.build(
from = Task(),
to = result
)
assertContentValuesEqual(contentValuesOf(
Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_DEFAULT
), result.entityValues)
}

@Test
fun `CLASS is PUBLIC`() {
val result = Entity(ContentValues())
builder.build(
from = Task(classification = Clazz(ImmutableClazz.VALUE_PUBLIC)),
to = result
)
assertContentValuesEqual(contentValuesOf(
Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_PUBLIC
), result.entityValues)
}

@Test
fun `CLASS is PRIVATE`() {
val result = Entity(ContentValues())
builder.build(
from = Task(classification = Clazz(ImmutableClazz.VALUE_PRIVATE)),
to = result
)
assertContentValuesEqual(contentValuesOf(
Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_PRIVATE
), result.entityValues)
}

@Test
fun `CLASS is CONFIDENTIAL`() {
val result = Entity(ContentValues())
builder.build(
from = Task(classification = Clazz(ImmutableClazz.VALUE_CONFIDENTIAL)),
to = result
)
assertContentValuesEqual(contentValuesOf(
Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_CONFIDENTIAL
), result.entityValues)
}

@Test
fun `Unknown CLASS maps to PRIVATE`() {
val result = Entity(ContentValues())
builder.build(
from = Task(classification = Clazz("X-CUSTOM")),
to = result
)
assertContentValuesEqual(contentValuesOf(
Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_PRIVATE
), result.entityValues)
}

}
Loading
Loading