diff --git a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt index c345f3133..6eb132723 100644 --- a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt +++ b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt @@ -19,7 +19,7 @@ import org.tasks.LocalBroadcastManager import org.tasks.R import org.tasks.Strings.isNullOrEmpty import org.tasks.analytics.Firebase -import org.tasks.data.* +import org.tasks.data.createDueDate import org.tasks.data.dao.AlarmDao import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.GoogleTaskDao @@ -38,7 +38,7 @@ import java.net.HttpRetryException import java.net.SocketException import java.net.SocketTimeoutException import java.net.UnknownHostException -import java.util.* +import java.util.Collections import javax.inject.Inject import javax.net.ssl.SSLException import kotlin.math.max @@ -132,30 +132,29 @@ class GoogleTaskSynchronizer @Inject constructor( continue } fetchAndApplyRemoteChanges(gtasksInvoker, list) - if (!preferences.isPositionHackEnabled) { - googleTaskDao.reposition(caldavDao, list.uuid!!) - } - } - if (preferences.isPositionHackEnabled) { - for (list in gtaskLists) { - val tasks = fetchPositions(gtasksInvoker, list.id) - for (task in tasks) { - googleTaskDao.updatePosition(task.id, task.parent, task.position) - } - googleTaskDao.reposition(caldavDao, list.id) - } + gtasksInvoker.updatePositions(list.uuid!!) } // account.etag = eTag account.error = "" } @Throws(IOException::class) - private suspend fun fetchPositions( - gtasksInvoker: GtasksInvoker, listId: String): List { + private suspend fun GtasksInvoker.updatePositions(list: String) { + // Unfortunately this is necessary because Google broke the API + // https://issuetracker.google.com/issues/132432317 + Timber.d("updatePositions(list=${list})") + fetchPositions(list).forEach { task -> + googleTaskDao.updatePosition(task.id, task.parent, task.position) + } + googleTaskDao.reposition(caldavDao, list) + } + + @Throws(IOException::class) + private suspend fun GtasksInvoker.fetchPositions(listId: String): List { val tasks: MutableList = ArrayList() var nextPageToken: String? = null do { - val taskList = gtasksInvoker.getAllPositions(listId, nextPageToken) + val taskList = getAllPositions(listId, nextPageToken) taskList?.items?.let { tasks.addAll(it) } diff --git a/app/src/main/java/org/tasks/jobs/SyncWork.kt b/app/src/main/java/org/tasks/jobs/SyncWork.kt index 4a74e9220..a9029ca64 100644 --- a/app/src/main/java/org/tasks/jobs/SyncWork.kt +++ b/app/src/main/java/org/tasks/jobs/SyncWork.kt @@ -96,9 +96,6 @@ class SyncWork @AssistedInject constructor( private val syncStatus = R.string.p_sync_ongoing private suspend fun doSync() { - if (preferences.isManualSort) { - preferences.isPositionHackEnabled = true - } val hasNetworkConnectivity = context.hasNetworkConnectivity() if (hasNetworkConnectivity) { googleTaskJobs().plus(caldavJobs()).awaitAll() diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt index 019cead4c..cd0896218 100644 --- a/app/src/main/java/org/tasks/preferences/Preferences.kt +++ b/app/src/main/java/org/tasks/preferences/Preferences.kt @@ -467,10 +467,6 @@ class Preferences @JvmOverloads constructor( fun getPrefs(c: Class): Map = prefs.all.filter { (_, value) -> c.isInstance(value) } as Map - var isPositionHackEnabled: Boolean - get() = getLong(R.string.p_google_tasks_position_hack, 0) > currentTimeMillis() - ONE_WEEK - set(value) { setLong(R.string.p_google_tasks_position_hack, if (value) currentTimeMillis() else 0) } - override var isManualSort: Boolean get() = getBoolean(R.string.p_manual_sort, false) set(value) { setBoolean(R.string.p_manual_sort, value) } diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 326d2f050..408179b13 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -373,7 +373,6 @@ linkify_task_edit preference_screen google_tasks_add_to_top - google_tasks_position_hack wearable_notifications notified_oauth_error_%1$s_%2$s chip_appearance