mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-07-14 18:21:57 +00:00
Improve offline task creation/editing. Fixes #1009
This commit is contained in:
parent
43db91293b
commit
affbe2d90e
6 changed files with 26 additions and 28 deletions
|
|
@ -28,8 +28,8 @@ interface TaskRepository : BaseRepository {
|
||||||
|
|
||||||
fun getTask(taskId: String): Flowable<Task>
|
fun getTask(taskId: String): Flowable<Task>
|
||||||
fun getTaskCopy(taskId: String): Flowable<Task>
|
fun getTaskCopy(taskId: String): Flowable<Task>
|
||||||
fun createTask(task: Task): Flowable<Task>
|
fun createTask(task: Task, force: Boolean = false): Flowable<Task>
|
||||||
fun updateTask(task: Task): Maybe<Task>?
|
fun updateTask(task: Task, force: Boolean = false): Maybe<Task>?
|
||||||
fun deleteTask(taskId: String): Flowable<Void>
|
fun deleteTask(taskId: String): Flowable<Void>
|
||||||
fun saveTask(task: Task)
|
fun saveTask(task: Task)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -134,9 +134,9 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
|
||||||
|
|
||||||
override fun getTaskCopy(taskId: String): Flowable<Task> = localRepository.getTaskCopy(taskId)
|
override fun getTaskCopy(taskId: String): Flowable<Task> = localRepository.getTaskCopy(taskId)
|
||||||
|
|
||||||
override fun createTask(task: Task): Flowable<Task> {
|
override fun createTask(task: Task, force: Boolean): Flowable<Task> {
|
||||||
val now = Date().time
|
val now = Date().time
|
||||||
if (lastTaskAction > now - 500) {
|
if (lastTaskAction > now - 500 && !force) {
|
||||||
return Flowable.empty()
|
return Flowable.empty()
|
||||||
}
|
}
|
||||||
lastTaskAction = now
|
lastTaskAction = now
|
||||||
|
|
@ -171,44 +171,43 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
|
||||||
if (task.id == null) {
|
if (task.id == null) {
|
||||||
task.id = UUID.randomUUID().toString()
|
task.id = UUID.randomUUID().toString()
|
||||||
}
|
}
|
||||||
localRepository.saveTask(task)
|
localRepository.saveSyncronous(task)
|
||||||
|
|
||||||
return apiClient.createTask(task)
|
return apiClient.createTask(task)
|
||||||
.map { task1 ->
|
.map { task1 ->
|
||||||
task1.dateCreated = Date()
|
task1.dateCreated = Date()
|
||||||
task1
|
task1
|
||||||
}
|
}
|
||||||
.doOnNext { localRepository.saveTask(it) }
|
.doOnNext { localRepository.save(it) }
|
||||||
.doOnError {
|
.doOnError {
|
||||||
task.hasErrored = true
|
task.hasErrored = true
|
||||||
task.isSaving = false
|
task.isSaving = false
|
||||||
localRepository.save(task)
|
localRepository.saveSyncronous(task)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("ReturnCount")
|
@Suppress("ReturnCount")
|
||||||
override fun updateTask(task: Task): Maybe<Task> {
|
override fun updateTask(task: Task, force: Boolean): Maybe<Task> {
|
||||||
val now = Date().time
|
val now = Date().time
|
||||||
if (lastTaskAction > now - 500 || !task.isValid) {
|
if ((lastTaskAction > now - 500 && !force)|| !task.isValid ) {
|
||||||
return Maybe.just(task)
|
return Maybe.just(task)
|
||||||
}
|
}
|
||||||
lastTaskAction = now
|
lastTaskAction = now
|
||||||
val id = task.id ?: return Maybe.just(task)
|
val id = task.id ?: return Maybe.just(task)
|
||||||
|
val unmanagedTask = localRepository.getUnmanagedCopy(task)
|
||||||
task.isSaving = true
|
unmanagedTask.isSaving = true
|
||||||
task.hasErrored = false
|
unmanagedTask.hasErrored = false
|
||||||
localRepository.saveTask(task)
|
localRepository.saveSyncronous(unmanagedTask)
|
||||||
return localRepository.getTaskCopy(id).firstElement()
|
return apiClient.updateTask(id, unmanagedTask).singleElement()
|
||||||
.flatMap { task1 -> apiClient.updateTask(id, task1).singleElement() }
|
|
||||||
.map { task1 ->
|
.map { task1 ->
|
||||||
task1.position = task.position
|
task1.position = task.position
|
||||||
task1
|
task1
|
||||||
}
|
}
|
||||||
.doOnSuccess { localRepository.saveTask(it) }
|
.doOnSuccess { localRepository.save(it) }
|
||||||
.doOnError {
|
.doOnError {
|
||||||
task.hasErrored = true
|
unmanagedTask.hasErrored = true
|
||||||
task.isSaving = false
|
unmanagedTask.isSaving = false
|
||||||
localRepository.save(task)
|
localRepository.saveSyncronous(unmanagedTask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -218,7 +217,7 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun saveTask(task: Task) {
|
override fun saveTask(task: Task) {
|
||||||
localRepository.saveTask(task)
|
localRepository.save(task)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createTasks(newTasks: List<Task>): Flowable<List<Task>> = apiClient.createTasks(newTasks)
|
override fun createTasks(newTasks: List<Task>): Flowable<List<Task>> = apiClient.createTasks(newTasks)
|
||||||
|
|
@ -273,9 +272,9 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
|
||||||
.map { localRepository.getUnmanagedCopy(it) }
|
.map { localRepository.getUnmanagedCopy(it) }
|
||||||
.flatMap {
|
.flatMap {
|
||||||
return@flatMap if (it.isCreating) {
|
return@flatMap if (it.isCreating) {
|
||||||
createTask(it)
|
createTask(it, true)
|
||||||
} else {
|
} else {
|
||||||
updateTask(it).toFlowable()
|
updateTask(it, true).toFlowable()
|
||||||
}
|
}
|
||||||
}.toList()
|
}.toList()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,4 +17,5 @@ interface BaseLocalRepository {
|
||||||
|
|
||||||
fun <T : RealmObject> save(objects: List<T>)
|
fun <T : RealmObject> save(objects: List<T>)
|
||||||
fun <T : RealmObject> save(`object`: T)
|
fun <T : RealmObject> save(`object`: T)
|
||||||
|
fun <T : RealmObject> saveSyncronous(`object`: T)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,6 @@ interface TaskLocalRepository : BaseLocalRepository {
|
||||||
|
|
||||||
fun saveTasks(userId: String, tasksOrder: TasksOrder, tasks: TaskList)
|
fun saveTasks(userId: String, tasksOrder: TasksOrder, tasks: TaskList)
|
||||||
|
|
||||||
fun saveTask(task: Task)
|
|
||||||
|
|
||||||
fun deleteTask(taskID: String)
|
fun deleteTask(taskID: String)
|
||||||
|
|
||||||
fun getTask(taskId: String): Flowable<Task>
|
fun getTask(taskId: String): Flowable<Task>
|
||||||
|
|
|
||||||
|
|
@ -43,4 +43,8 @@ abstract class RealmBaseLocalRepository internal constructor(protected var realm
|
||||||
override fun <T : RealmObject> save(objects: List<T>) {
|
override fun <T : RealmObject> save(objects: List<T>) {
|
||||||
realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(objects) }
|
realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(objects) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun <T : RealmObject> saveSyncronous(`object`: T) {
|
||||||
|
realm.executeTransaction { realm1 -> realm1.insertOrUpdate(`object`) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -68,10 +68,6 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm),
|
||||||
return taskList
|
return taskList
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun saveTask(task: Task) {
|
|
||||||
realm.executeTransaction { realm1 -> realm1.insertOrUpdate(task) }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun removeOldTasks(userID: String, onlineTaskList: List<Task>) {
|
private fun removeOldTasks(userID: String, onlineTaskList: List<Task>) {
|
||||||
val localTasks = realm.where(Task::class.java)
|
val localTasks = realm.where(Task::class.java)
|
||||||
.equalTo("userId", userID)
|
.equalTo("userId", userID)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue