mirror of https://github.com/tasks/tasks
Synchronize list icons with CalDAV
parent
c5f8583146
commit
3a37d6481e
@ -0,0 +1,32 @@
|
||||
package org.tasks.caldav.property
|
||||
|
||||
import at.bitfire.dav4jvm.Property
|
||||
import at.bitfire.dav4jvm.PropertyFactory
|
||||
import at.bitfire.dav4jvm.XmlUtils
|
||||
import org.xmlpull.v1.XmlPullParser
|
||||
import timber.log.Timber
|
||||
|
||||
data class CalendarIcon(
|
||||
val icon: String,
|
||||
): Property {
|
||||
companion object Companion {
|
||||
@JvmField
|
||||
val NAME = Property.Name(PropertyUtils.NS_TASKS, "x-calendar-icon")
|
||||
}
|
||||
|
||||
object Factory: PropertyFactory {
|
||||
|
||||
override fun getName() = NAME
|
||||
|
||||
override fun create(parser: XmlPullParser): CalendarIcon? {
|
||||
XmlUtils.readText(parser)?.takeIf { it.isNotBlank() }?.let {
|
||||
try {
|
||||
return CalendarIcon(it)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
Timber.e(e, "Couldn't parse icon: $it")
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,10 +1,6 @@
|
||||
package org.tasks.caldav.property
|
||||
|
||||
import at.bitfire.dav4jvm.PropertyFactory
|
||||
import at.bitfire.dav4jvm.PropertyRegistry
|
||||
|
||||
object PropertyUtils {
|
||||
const val NS_TASKS = "http://org.tasks/ns/"
|
||||
const val NS_OWNCLOUD = "http://owncloud.org/ns"
|
||||
|
||||
fun PropertyRegistry.register(vararg factories: PropertyFactory) = register(factories.toList())
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,55 @@
|
||||
package org.tasks.jobs
|
||||
|
||||
import android.content.Context
|
||||
import androidx.hilt.work.HiltWorker
|
||||
import androidx.work.WorkerParameters
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedInject
|
||||
import org.tasks.analytics.Firebase
|
||||
import org.tasks.caldav.CaldavClientProvider
|
||||
import org.tasks.caldav.property.CalendarIcon
|
||||
import org.tasks.data.dao.CaldavDao
|
||||
import org.tasks.data.entity.CaldavAccount
|
||||
import org.tasks.injection.BaseWorker
|
||||
import timber.log.Timber
|
||||
|
||||
@HiltWorker
|
||||
class UpgradeIconSyncWork @AssistedInject constructor(
|
||||
@Assisted context: Context,
|
||||
@Assisted workerParams: WorkerParameters,
|
||||
firebase: Firebase,
|
||||
private val clientProvider: CaldavClientProvider,
|
||||
private val caldavDao: CaldavDao,
|
||||
) : BaseWorker(context, workerParams, firebase) {
|
||||
override suspend fun run(): Result {
|
||||
var response = Result.success()
|
||||
caldavDao
|
||||
.getAccounts(CaldavAccount.TYPE_TASKS, CaldavAccount.TYPE_CALDAV)
|
||||
.forEach { account ->
|
||||
Timber.d("Uploading icons for $account")
|
||||
val caldavClient = clientProvider.forAccount(account)
|
||||
caldavClient.calendars().forEach { remote ->
|
||||
val url = remote.href
|
||||
val calendar = caldavDao
|
||||
.getCalendarByUrl(account.uuid!!, url.toString())
|
||||
?.takeIf { !it.readOnly() && it.icon?.isNotBlank() == true }
|
||||
?: run {
|
||||
Timber.d("No icon set for $url")
|
||||
return@forEach
|
||||
}
|
||||
val icon = remote[CalendarIcon::class.java]?.icon
|
||||
if (icon?.isNotBlank() == true) {
|
||||
Timber.d("Remote icon already set for $url")
|
||||
return@forEach
|
||||
}
|
||||
Timber.d("Uploading icon to ${calendar.icon} for $url")
|
||||
caldavClient.updateIcon(
|
||||
url = url,
|
||||
icon = calendar.icon,
|
||||
onFailure = { response = Result.retry() }
|
||||
)
|
||||
}
|
||||
}
|
||||
return response
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue