Skip to content

Commit 59d2728

Browse files
authored
AndroidEvent: update without event color correctly resets color (#180)
1 parent 46d1799 commit 59d2728

File tree

2 files changed

+57
-15
lines changed

2 files changed

+57
-15
lines changed

lib/src/androidTest/kotlin/at/bitfire/ical4android/AndroidEventTest.kt

+34-2
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,6 @@ class AndroidEventTest {
581581

582582
@Test
583583
fun testBuildEvent_Color_WhenNotAvailable() {
584-
AndroidCalendar.removeColors(provider, testAccount)
585584
buildEvent(true) {
586585
color = Css3Color.darkseagreen
587586
}.let { result ->
@@ -1700,7 +1699,7 @@ class AndroidEventTest {
17001699
}
17011700

17021701
@Test
1703-
fun testPopulateEvent_Color() {
1702+
fun testPopulateEvent_Color_FromIndex() {
17041703
AndroidCalendar.insertColors(provider, testAccount)
17051704
populateEvent(true) {
17061705
put(Events.EVENT_COLOR_KEY, Css3Color.silver.name)
@@ -1709,6 +1708,15 @@ class AndroidEventTest {
17091708
}
17101709
}
17111710

1711+
@Test
1712+
fun testPopulateEvent_Color_FromValue() {
1713+
populateEvent(true) {
1714+
put(Events.EVENT_COLOR, Css3Color.silver.argb)
1715+
}.let { result ->
1716+
assertEquals(Css3Color.silver, result.color)
1717+
}
1718+
}
1719+
17121720
@Test
17131721
fun testPopulateEvent_Status_Confirmed() {
17141722
populateEvent(true) {
@@ -2357,6 +2365,30 @@ class AndroidEventTest {
23572365
}
23582366
}
23592367

2368+
@Test
2369+
fun testUpdateEvent_ResetColor() {
2370+
// add event with color
2371+
val event = Event().apply {
2372+
uid = "sample1@testAddEvent"
2373+
dtStart = DtStart(DateTime())
2374+
color = Css3Color.silver
2375+
}
2376+
val uri = TestEvent(calendar, event).add()
2377+
val id = ContentUris.parseId(uri)
2378+
2379+
// verify that it has color
2380+
val beforeUpdate = calendar.findById(id)
2381+
assertNotNull(beforeUpdate.event?.color)
2382+
2383+
// update: reset color
2384+
event.color = null
2385+
beforeUpdate.update(event)
2386+
2387+
// verify that it doesn't have color anymore
2388+
val afterUpdate = calendar.findById(id)
2389+
assertNull(afterUpdate.event!!.color)
2390+
}
2391+
23602392
@Test
23612393
fun testUpdateEvent_UpdateStatusFromNull() {
23622394
val event = Event()

lib/src/main/kotlin/at/bitfire/ical4android/AndroidEvent.kt

+23-13
Original file line numberDiff line numberDiff line change
@@ -336,13 +336,19 @@ abstract class AndroidEvent(
336336
event.location = row.getAsString(Events.EVENT_LOCATION)
337337
event.description = row.getAsString(Events.DESCRIPTION)
338338

339-
row.getAsString(Events.EVENT_COLOR_KEY)?.let { name ->
340-
try {
341-
event.color = Css3Color.valueOf(name)
342-
} catch (e: IllegalArgumentException) {
343-
logger.warning("Ignoring unknown color $name from Calendar Provider")
339+
// color can be specified as RGB value and/or as index key (CSS3 color of AndroidCalendar)
340+
event.color =
341+
row.getAsString(Events.EVENT_COLOR_KEY)?.let { name -> // try color key first
342+
try {
343+
Css3Color.valueOf(name)
344+
} catch (_: IllegalArgumentException) {
345+
logger.warning("Ignoring unknown color name \"$name\"")
346+
null
347+
}
348+
} ?:
349+
row.getAsInteger(Events.EVENT_COLOR)?.let { color -> // otherwise, try to find the color name from the value
350+
Css3Color.entries.firstOrNull { it.argb == color }
344351
}
345-
}
346352

347353
// status
348354
when (row.getAsInteger(Events.STATUS)) {
@@ -928,18 +934,22 @@ abstract class AndroidEvent(
928934
builder.withValue(Events.TITLE, event.summary)
929935
builder.withValue(Events.EVENT_LOCATION, event.location)
930936
builder.withValue(Events.DESCRIPTION, event.description)
931-
builder.withValue(Events.EVENT_COLOR_KEY, event.color?.let { color ->
932-
val colorName = color.name
937+
938+
val color = event.color
939+
if (color != null) {
933940
// set event color (if it's available for this account)
934941
calendar.provider.query(Colors.CONTENT_URI.asSyncAdapter(calendar.account), arrayOf(Colors.COLOR_KEY),
935-
"${Colors.COLOR_KEY}=? AND ${Colors.COLOR_TYPE}=${Colors.TYPE_EVENT}", arrayOf(colorName), null)?.use { cursor ->
942+
"${Colors.COLOR_KEY}=? AND ${Colors.COLOR_TYPE}=${Colors.TYPE_EVENT}", arrayOf(color.name), null)?.use { cursor ->
936943
if (cursor.moveToNext())
937-
return@let colorName
944+
builder.withValue(Events.EVENT_COLOR_KEY, color.name)
938945
else
939-
logger.fine("Ignoring event color: $colorName (not available for this account)")
946+
logger.fine("Ignoring event color \"${color.name}\" (not available for this account)")
940947
}
941-
null
942-
})
948+
} else {
949+
// reset color index and value
950+
builder .withValue(Events.EVENT_COLOR_KEY, null)
951+
.withValue(Events.EVENT_COLOR, null)
952+
}
943953

944954
// scheduling
945955
val groupScheduled = event.attendees.isNotEmpty()

0 commit comments

Comments
 (0)