Add DecSync CC support

pull/1258/head
Alex Baker 5 years ago
parent 6bb003f8f4
commit 5246b5e0d1

@ -7,4 +7,5 @@ object Constants {
const val SYNC_TYPE_GOOGLE_TASKS = "google_tasks"
const val SYNC_TYPE_ETESYNC_OT = "etesync_ot"
const val SYNC_TYPE_ETEBASE = "etebase"
const val SYNC_TYPE_DECSYNC = "decsync"
}

@ -13,7 +13,6 @@ import org.tasks.R
import org.tasks.activities.BaseListSettingsActivity
import org.tasks.caldav.CaldavCalendarSettingsActivity
import org.tasks.caldav.LocalListSettingsActivity
import org.tasks.data.OpenTaskDao.Companion.ACCOUNT_TYPE_ETESYNC
import org.tasks.etebase.EtebaseCalendarSettingsActivity
import org.tasks.etesync.EteSyncCalendarSettingsActivity
import org.tasks.opentasks.OpenTasksListSettingsActivity
@ -100,9 +99,6 @@ class CaldavAccount : Parcelable {
val isOpenTasks: Boolean
get() = accountType == TYPE_OPENTASKS
val isOpenTaskEteSync: Boolean
get() = uuid.openTaskType() == ACCOUNT_TYPE_ETESYNC
val isTasksOrg: Boolean
get() = accountType == TYPE_TASKS

@ -38,7 +38,7 @@ class OpenTaskDao @Inject constructor(
cr.query(
TaskLists.getContentUri(authority),
null,
"${TaskListColumns.SYNC_ENABLED}=1 AND ($ACCOUNT_TYPE = '$ACCOUNT_TYPE_DAVx5' OR $ACCOUNT_TYPE = '$ACCOUNT_TYPE_ETESYNC')",
"${TaskListColumns.SYNC_ENABLED}=1 AND ($SUPPORTED_TYPE_FILTER)",
null,
null)?.use {
while (it.moveToNext()) {
@ -240,14 +240,27 @@ class OpenTaskDao @Inject constructor(
companion object {
private const val OPENTASK_BATCH_LIMIT = 499
const val ACCOUNT_TYPE_DAVx5 = "bitfire.at.davdroid"
const val ACCOUNT_TYPE_ETESYNC = "com.etesync.syncadapter"
private const val ACCOUNT_TYPE_DAVx5 = "bitfire.at.davdroid"
private const val ACCOUNT_TYPE_ETESYNC = "com.etesync.syncadapter"
private const val ACCOUNT_TYPE_DECSYNC = "org.decsync.tasks"
val SUPPORTED_TYPES = setOf(
ACCOUNT_TYPE_DAVx5,
ACCOUNT_TYPE_ETESYNC,
ACCOUNT_TYPE_DECSYNC
)
val SUPPORTED_TYPE_FILTER = SUPPORTED_TYPES.joinToString(" OR ") { "ACCOUNT_TYPE = '$it'" }
suspend fun Map<String, List<CaldavCalendar>>.newAccounts(caldavDao: CaldavDao) =
filterNot { (_, lists) -> caldavDao.anyExist(lists.map { it.url!! }) }
.map { it.key }
.distinct()
fun String?.isDavx5(): Boolean = this?.startsWith(ACCOUNT_TYPE_DAVx5) == true
fun String?.isEteSync(): Boolean = this?.startsWith(ACCOUNT_TYPE_ETESYNC) == true
fun String?.isDecSync(): Boolean = this?.startsWith(ACCOUNT_TYPE_DECSYNC) == true
fun Cursor.getString(columnName: String): String? =
getString(getColumnIndex(columnName))

@ -13,8 +13,7 @@ import org.tasks.analytics.Firebase
import org.tasks.data.CaldavAccount.Companion.TYPE_OPENTASKS
import org.tasks.data.CaldavDao
import org.tasks.data.OpenTaskDao
import org.tasks.data.OpenTaskDao.Companion.ACCOUNT_TYPE_DAVx5
import org.tasks.data.OpenTaskDao.Companion.ACCOUNT_TYPE_ETESYNC
import org.tasks.data.OpenTaskDao.Companion.SUPPORTED_TYPES
import org.tasks.opentasks.OpenTasksSynchronizer
import org.tasks.preferences.Preferences
@ -41,7 +40,7 @@ class SyncOpenTasksWork @WorkerInject constructor(
AccountManager
.get(context)
.accounts
.filter { it.type == ACCOUNT_TYPE_DAVx5 || it.type == ACCOUNT_TYPE_ETESYNC }
.filter { SUPPORTED_TYPES.contains(it.type) }
.forEach {
ContentResolver.requestSync(
it,

@ -9,6 +9,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.caldav.BaseCaldavAccountSettingsActivity
import org.tasks.data.OpenTaskDao.Companion.isDavx5
@AndroidEntryPoint
class OpenTaskAccountSettingsActivity : BaseCaldavAccountSettingsActivity(), Toolbar.OnMenuItemClickListener {
@ -20,13 +21,12 @@ class OpenTaskAccountSettingsActivity : BaseCaldavAccountSettingsActivity(), Too
binding.passwordLayout.visibility = View.GONE
binding.urlLayout.visibility = View.GONE
if (caldavAccount!!.isOpenTaskEteSync) {
if (caldavAccount?.uuid?.isDavx5() != true) {
binding.repeat.visibility = View.GONE
}
}
override val newPassword: String?
get() = ""
override val newPassword = ""
private suspend fun updateAccount(principal: String?) {
hideProgressIndicator()
@ -35,7 +35,7 @@ class OpenTaskAccountSettingsActivity : BaseCaldavAccountSettingsActivity(), Too
caldavAccount!!.username = newUsername
caldavAccount!!.error = ""
if (passwordChanged()) {
caldavAccount!!.password = encryption.encrypt(newPassword!!)
caldavAccount!!.password = encryption.encrypt(newPassword)
}
caldavAccount!!.isSuppressRepeatingTasks = binding.repeat.isChecked
caldavDao.update(caldavAccount!!)

@ -30,6 +30,9 @@ import org.tasks.data.CaldavAccount.Companion.openTaskType
import org.tasks.data.OpenTaskDao.Companion.getInt
import org.tasks.data.OpenTaskDao.Companion.getLong
import org.tasks.data.OpenTaskDao.Companion.getString
import org.tasks.data.OpenTaskDao.Companion.isDavx5
import org.tasks.data.OpenTaskDao.Companion.isDecSync
import org.tasks.data.OpenTaskDao.Companion.isEteSync
import org.tasks.data.OpenTaskDao.Companion.newAccounts
import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.time.DateTime
@ -72,10 +75,11 @@ class OpenTasksSynchronizer @Inject constructor(
.forEach {
firebase.logEvent(
R.string.event_sync_add_account,
R.string.param_type to if (it.isOpenTaskEteSync) {
Constants.SYNC_TYPE_ETESYNC_OT
} else {
Constants.SYNC_TYPE_DAVX5
R.string.param_type to when {
it.uuid.isDavx5() -> Constants.SYNC_TYPE_DAVX5
it.uuid.isEteSync() -> Constants.SYNC_TYPE_ETESYNC_OT
it.uuid.isDecSync() -> Constants.SYNC_TYPE_DECSYNC
else -> throw IllegalArgumentException()
}
)
}
@ -131,7 +135,7 @@ class OpenTasksSynchronizer @Inject constructor(
listId: Long
) {
Timber.d("SYNC $calendar")
val isEteSync = account.isOpenTaskEteSync
val isEteSync = account.uuid?.isEteSync() == true
val moved = caldavDao.getMoved(calendar.uuid!!)
val (deleted, updated) =

@ -22,8 +22,9 @@ import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS
import org.tasks.data.CaldavDao
import org.tasks.data.GoogleTaskAccount
import org.tasks.data.GoogleTaskListDao
import org.tasks.data.OpenTaskDao.Companion.ACCOUNT_TYPE_DAVx5
import org.tasks.data.OpenTaskDao.Companion.ACCOUNT_TYPE_ETESYNC
import org.tasks.data.OpenTaskDao.Companion.isDavx5
import org.tasks.data.OpenTaskDao.Companion.isDecSync
import org.tasks.data.OpenTaskDao.Companion.isEteSync
import org.tasks.etebase.EtebaseAccountSettingsActivity
import org.tasks.etesync.EteSyncAccountSettingsActivity
import org.tasks.injection.InjectingPreferenceFragment
@ -151,13 +152,10 @@ class Synchronization : InjectingPreferenceFragment() {
preference.setSummary(when {
account.isCaldavAccount -> R.string.caldav
account.isEteSyncAccount -> R.string.etesync_v1
account.isEtebaseAccount
|| (account.isOpenTasks
&& account.uuid?.startsWith(ACCOUNT_TYPE_ETESYNC) == true) ->
R.string.etesync
account.isOpenTasks
&& account.uuid?.startsWith(ACCOUNT_TYPE_DAVx5) == true ->
R.string.davx5
account.isEtebaseAccount -> R.string.etesync
account.isOpenTasks && account.uuid.isEteSync() -> R.string.etesync
account.isOpenTasks && account.uuid.isDavx5() -> R.string.davx5
account.isOpenTasks && account.uuid.isDecSync() -> R.string.decsync
else -> 0
})
} else {

@ -67,6 +67,8 @@ class AddAccountDialog : DialogFragment() {
3 -> activity?.startActivityForResult(
Intent(activity, EtebaseAccountSettingsActivity::class.java),
REQUEST_CALDAV_SETTINGS)
4 -> activity?.startActivity(
Intent(ACTION_VIEW, Uri.parse(getString(R.string.url_decsync))))
}
dialog.dismiss()
}

@ -0,0 +1,8 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="512" android:viewportWidth="512"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#ffffff" android:pathData="M0.647,-0.537l512.237,0l0,514.106l-512.237,0z"/>
<path android:fillColor="#0277BB" android:fillType="nonZero" android:pathData="M0,-0L0,512L512,512L512,-0L0,-0ZM292.5,49.5C343.3,58.5 388.2,84.8 419.7,123.9C429.4,136.1 438.9,150.9 440.4,156.1C442.2,162.8 436.4,170.7 428.1,173C420.5,175 417.1,172.6 408.3,159C389.7,130.5 368.2,111 339,96.1C277.7,65 206.5,71 150.5,112.2C140.4,119.6 120.6,140 112.8,151C104,163.4 93.1,184.8 88.7,198.6C85.4,208.7 81,227.6 81,231.4C81,232.8 82.5,233 91,233C96.5,233 101,233.3 101,233.7C101,234.6 64.8,297.1 64.5,296.8C63.8,296.2 28,234 28,233.5C28,233.2 33.1,233 39.3,233L50.7,233L52,224.2C62.1,156 106.4,96.2 169,66.7C193.8,55 222.7,47.8 249.5,46.7C259.9,46.3 283.1,47.8 292.5,49.5ZM206,127L206,152L306,152L306,127L331,127L331,152L339.8,152C346.8,152 349.5,152.5 353.5,154.4C359.3,157.1 363.4,160.9 366.4,166.5L368.5,170.5L368.5,359.5L366.3,363.5C363.8,368.2 358.9,373 354,375.6C350.7,377.4 346.2,377.5 256,377.5L161.5,377.5L157.5,375.3C152.8,372.8 148,367.9 145.4,363C143.6,359.7 143.5,355.2 143.5,265L143.5,170.5L145.6,166.5C148.6,160.9 152.7,157.1 158.5,154.4C162.5,152.5 165.2,152 172.3,152L181,152L181,127L206,127ZM469.4,243.9C479.1,260.6 487,274.7 487,275.1C487,275.6 481.8,276 475.5,276L464,276L464,279.1C464,284.2 459.2,306.2 455.9,316.8C448.1,341.3 435.1,365.4 419.3,385C405.9,401.6 385.3,419.7 367.1,431C319.6,460.4 260.7,469.6 206.6,455.9C152.4,442.2 105.6,407.1 77.7,358.9C74.1,352.7 74,346.3 77.5,342.2C81.1,337.9 88.3,334.6 92.3,335.4C97.5,336.5 99.7,338.6 107.3,350.3C119.3,368.7 131.3,381.8 147.3,394.3C188.8,426.8 240.3,439 292.5,429C353.5,417.2 405.1,372.3 425.8,312.9C429,303.7 434,282.9 434,278.7C434,276.1 434,276.1 424.5,275.8C419.3,275.6 414.9,275.1 414.9,274.7C414.7,273.1 450.4,212 451.1,212.8C451.5,213.2 459.8,227.2 469.4,243.9Z"/>
<path android:fillColor="#0277BB" android:fillType="nonZero" android:pathData="M247.6,191C241.3,192.6 232.1,198.1 228.4,202.4C226.5,204.6 223.7,208.9 222.2,212C219.8,216.9 219.5,218.6 219.5,227.5C219.5,236.4 219.8,238.1 222.2,243.1C229.6,258.2 246.3,266.9 262.2,264C274.3,261.8 284.3,254.2 289.7,243.2C292.2,238.1 292.5,236.4 292.5,227.5C292.5,218.6 292.2,216.9 289.8,212C285.6,203.4 280.8,198.5 272.7,194.5C264.7,190.6 254.9,189.2 247.6,191Z"/>
<path android:fillColor="#0277BB" android:fillType="nonZero" android:pathData="M240,290.5C220.9,293.6 200,301.8 190.7,310C183.8,316.1 181.7,320.7 181.2,331.2L180.8,340L331.2,340L330.8,331.2C330.5,324.9 329.8,321.4 328.2,318.4C321.9,306.2 298,294.6 271,290.5C259.6,288.7 251.4,288.7 240,290.5Z"/>
</vector>

@ -203,6 +203,7 @@
<item>@string/davx5</item>
<item>@string/caldav</item>
<item>@string/etesync</item>
<item>@string/decsync</item>
</string-array>
<string-array name="synchronization_services_description">
@ -210,6 +211,7 @@
<item>@string/davx5_selection_description</item>
<item>@string/caldav_selection_description</item>
<item>@string/etesync_selection_description</item>
<item>@string/decsync_selection_description</item>
</string-array>
<array name="synchronization_services_icons">
@ -217,6 +219,7 @@
<item>@drawable/ic_davx5_icon_green_bg</item>
<item>@drawable/ic_webdav_logo</item>
<item>@drawable/ic_etesync</item>
<item>@drawable/ic_decsync</item>
</array>
<string-array name="chip_styles">

@ -14,6 +14,7 @@
<string name="etesync">EteSync</string>
<string name="etesync_v1">EteSync v1</string>
<string name="davx5">DAVx⁵</string>
<string name="decsync">DecSync CC</string>
<string name="tasks_org">Tasks.org</string>
<string name="etesync_url">https://api.etesync.com</string>
<string name="etebase_url">https://api.etebase.com/partner/tasksorg/</string>
@ -22,6 +23,7 @@
<string name="url_davx5">https://tasks.org/davx5</string>
<string name="url_caldav">https://tasks.org/caldav</string>
<string name="url_etesync">https://tasks.org/etesync</string>
<string name="url_decsync">https://tasks.org/decsync</string>
<string name="url_tasker">https://tasks.org/help/tasker</string>
<string name="url_donate">https://tasks.org/donate</string>
<string name="url_reddit">https://reddit.com/r/tasks</string>

@ -554,6 +554,7 @@ File %1$s contained %2$s.\n\n
<string name="google_tasks_selection_description">Basic service that synchronizes with your Google account</string>
<string name="caldav_selection_description">Synchronization based on open internet standards</string>
<string name="etesync_selection_description">Open source, end-to-end encrypted synchronization</string>
<string name="decsync_selection_description">Synchronize your tasks with the DecSync CC app</string>
<string name="davx5_selection_description">Synchronize your tasks with the DAVx⁵ app</string>
<string name="show_advanced_settings">Show advanced settings</string>
<string name="caldav_account_description">Requires an account with a CalDAV service provider or a self-hosted server. Find a service provider by visiting tasks.org/caldav</string>

Loading…
Cancel
Save