diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt index c2a8940fc..4f9ca97eb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt @@ -28,8 +28,8 @@ interface TaskRepository : BaseRepository { fun getTask(taskId: String): Flowable fun getTaskCopy(taskId: String): Flowable - fun createTask(task: Task): Flowable - fun updateTask(task: Task): Maybe? + fun createTask(task: Task, force: Boolean = false): Flowable + fun updateTask(task: Task, force: Boolean = false): Maybe? fun deleteTask(taskId: String): Flowable fun saveTask(task: Task) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt index 113707da2..0e886d1fa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt @@ -134,9 +134,9 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli override fun getTaskCopy(taskId: String): Flowable = localRepository.getTaskCopy(taskId) - override fun createTask(task: Task): Flowable { + override fun createTask(task: Task, force: Boolean): Flowable { val now = Date().time - if (lastTaskAction > now - 500) { + if (lastTaskAction > now - 500 && !force) { return Flowable.empty() } lastTaskAction = now @@ -171,44 +171,43 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli if (task.id == null) { task.id = UUID.randomUUID().toString() } - localRepository.saveTask(task) + localRepository.saveSyncronous(task) return apiClient.createTask(task) .map { task1 -> task1.dateCreated = Date() task1 } - .doOnNext { localRepository.saveTask(it) } + .doOnNext { localRepository.save(it) } .doOnError { task.hasErrored = true task.isSaving = false - localRepository.save(task) + localRepository.saveSyncronous(task) } } @Suppress("ReturnCount") - override fun updateTask(task: Task): Maybe { + override fun updateTask(task: Task, force: Boolean): Maybe { val now = Date().time - if (lastTaskAction > now - 500 || !task.isValid) { + if ((lastTaskAction > now - 500 && !force)|| !task.isValid ) { return Maybe.just(task) } lastTaskAction = now val id = task.id ?: return Maybe.just(task) - - task.isSaving = true - task.hasErrored = false - localRepository.saveTask(task) - return localRepository.getTaskCopy(id).firstElement() - .flatMap { task1 -> apiClient.updateTask(id, task1).singleElement() } + val unmanagedTask = localRepository.getUnmanagedCopy(task) + unmanagedTask.isSaving = true + unmanagedTask.hasErrored = false + localRepository.saveSyncronous(unmanagedTask) + return apiClient.updateTask(id, unmanagedTask).singleElement() .map { task1 -> task1.position = task.position task1 } - .doOnSuccess { localRepository.saveTask(it) } + .doOnSuccess { localRepository.save(it) } .doOnError { - task.hasErrored = true - task.isSaving = false - localRepository.save(task) + unmanagedTask.hasErrored = true + unmanagedTask.isSaving = false + localRepository.saveSyncronous(unmanagedTask) } } @@ -218,7 +217,7 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli } override fun saveTask(task: Task) { - localRepository.saveTask(task) + localRepository.save(task) } override fun createTasks(newTasks: List): Flowable> = apiClient.createTasks(newTasks) @@ -273,9 +272,9 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli .map { localRepository.getUnmanagedCopy(it) } .flatMap { return@flatMap if (it.isCreating) { - createTask(it) + createTask(it, true) } else { - updateTask(it).toFlowable() + updateTask(it, true).toFlowable() } }.toList() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt index dbe4bba56..19d5da096 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.kt @@ -17,4 +17,5 @@ interface BaseLocalRepository { fun save(objects: List) fun save(`object`: T) + fun saveSyncronous(`object`: T) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.kt index a6af4dfae..733862d80 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/TaskLocalRepository.kt @@ -15,8 +15,6 @@ interface TaskLocalRepository : BaseLocalRepository { fun saveTasks(userId: String, tasksOrder: TasksOrder, tasks: TaskList) - fun saveTask(task: Task) - fun deleteTask(taskID: String) fun getTask(taskId: String): Flowable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt index 14a7a6c19..1707d4c62 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.kt @@ -43,4 +43,8 @@ abstract class RealmBaseLocalRepository internal constructor(protected var realm override fun save(objects: List) { realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(objects) } } + + override fun saveSyncronous(`object`: T) { + realm.executeTransaction { realm1 -> realm1.insertOrUpdate(`object`) } + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt index d72cb29b9..8ba73a7c6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmTaskLocalRepository.kt @@ -68,10 +68,6 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), return taskList } - override fun saveTask(task: Task) { - realm.executeTransaction { realm1 -> realm1.insertOrUpdate(task) } - } - private fun removeOldTasks(userID: String, onlineTaskList: List) { val localTasks = realm.where(Task::class.java) .equalTo("userId", userID)