Show completed todos in the app. Fixes #926

This commit is contained in:
Phillip Thelen 2018-02-12 13:17:57 +01:00
parent 5add7794c6
commit 75b13764b7
6 changed files with 51 additions and 4 deletions

View file

@ -53,4 +53,5 @@ interface TaskRepository : BaseRepository {
fun getTaskCopies(tasks: List<Task>): Observable<List<Task>>
fun updateDailiesIsDue(date: Date): Observable<TaskList>
fun retrieveCompletedTodos(userId: String): Observable<TaskList>
}

View file

@ -40,6 +40,16 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
.doOnNext { res -> this.localRepository.saveTasks(userId, tasksOrder, res) }
}
override fun retrieveCompletedTodos(userId: String): Observable<TaskList> {
return this.apiClient.getTasks("completedTodos")
.doOnNext { taskList ->
val tasks = taskList.tasks
if (tasks != null) {
this.localRepository.saveCompletedTodos(userId, tasks.values)
}
}
}
override fun retrieveTasks(userId: String, tasksOrder: TasksOrder, dueDate: Date): Observable<TaskList> {
val formatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.US)
return this.apiClient.getTasks("dailys", formatter.format(dueDate))

View file

@ -32,4 +32,5 @@ interface TaskLocalRepository : BaseLocalRepository {
fun updateIsdue(daily: TaskList): Observable<TaskList>
fun updateTaskPositions(taskOrder: List<String>)
fun saveCompletedTodos(userId: String, tasks: MutableCollection<Task>)
}

View file

@ -9,9 +9,8 @@ import com.habitrpg.android.habitica.models.tasks.TasksOrder
import io.realm.Realm
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.Sort
import rx.Observable
import java.util.*
import kotlin.collections.ArrayList
class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), TaskLocalRepository {
@ -54,6 +53,11 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm),
realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(sortedTasks) }
}
override fun saveCompletedTodos(userId: String, tasks: MutableCollection<Task>) {
removeCompletedTodos(userId, tasks)
realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(tasks) }
}
private fun sortTasks(taskMap: MutableMap<String, Task>, taskOrder: List<String>): List<Task> {
val taskList = ArrayList<Task>()
var position = 0
@ -74,7 +78,35 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm),
}
private fun removeOldTasks(userID: String, onlineTaskList: List<Task>) {
val localTasks = realm.where(Task::class.java).equalTo("userId", userID).findAll().createSnapshot()
val localTasks = realm.where(Task::class.java)
.equalTo("userId", userID)
.beginGroup()
.beginGroup()
.equalTo("type", Task.TYPE_TODO)
.equalTo("completed", false)
.endGroup()
.or()
.notEqualTo("type", Task.TYPE_TODO)
.endGroup()
.findAll()
.createSnapshot()
val tasksToDelete = localTasks.filterNot { onlineTaskList.contains(it) }
realm.executeTransaction {
for (localTask in tasksToDelete) {
localTask.checklist.deleteAllFromRealm()
localTask.reminders.deleteAllFromRealm()
localTask.deleteFromRealm()
}
}
}
private fun removeCompletedTodos(userID: String, onlineTaskList: MutableCollection<Task>) {
val localTasks = realm.where(Task::class.java)
.equalTo("userId", userID)
.equalTo("type", Task.TYPE_TODO)
.equalTo("completed", true)
.findAll()
.createSnapshot()
val tasksToDelete = localTasks.filterNot { onlineTaskList.contains(it) }
realm.executeTransaction {
for (localTask in tasksToDelete) {

View file

@ -147,7 +147,6 @@ abstract class RealmBaseTasksRecyclerViewAdapter<VH : BaseTaskViewHolder>(privat
if (taskFilterHelper != null) {
val query = taskFilterHelper.createQuery(unfilteredData)
updateData(query.findAllSorted("position"))
}
}

View file

@ -266,6 +266,10 @@ open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, Swip
taskFilterHelper.setActiveFilter(classType, activeFilter)
}
recyclerAdapter?.filter()
if (activeFilter == Task.FILTER_COMPLETED) {
compositeSubscription.add(taskRepository.retrieveCompletedTodos(userID).subscribe(Action1 {}, RxErrorHandler.handleEmptyError()))
}
}
companion object {