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 7a5e995d0..e77eed619 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 @@ -53,4 +53,5 @@ interface TaskRepository : BaseRepository { fun getTaskCopies(tasks: List): Observable> fun updateDailiesIsDue(date: Date): Observable + fun retrieveCompletedTodos(userId: String): Observable } 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 a720ade74..0957e5969 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 @@ -40,6 +40,16 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli .doOnNext { res -> this.localRepository.saveTasks(userId, tasksOrder, res) } } + override fun retrieveCompletedTodos(userId: String): Observable { + 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 { val formatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.US) return this.apiClient.getTasks("dailys", formatter.format(dueDate)) 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 5b84cacb8..d2f25f107 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 @@ -32,4 +32,5 @@ interface TaskLocalRepository : BaseLocalRepository { fun updateIsdue(daily: TaskList): Observable fun updateTaskPositions(taskOrder: List) + fun saveCompletedTodos(userId: String, tasks: MutableCollection) } 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 c86597a85..6d9cad9d0 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 @@ -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) { + removeCompletedTodos(userId, tasks) + realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(tasks) } + } + private fun sortTasks(taskMap: MutableMap, taskOrder: List): List { val taskList = ArrayList() var position = 0 @@ -74,7 +78,35 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm), } private fun removeOldTasks(userID: String, onlineTaskList: List) { - 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) { + 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) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RealmBaseTasksRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RealmBaseTasksRecyclerViewAdapter.kt index c5b3b6316..902940280 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RealmBaseTasksRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RealmBaseTasksRecyclerViewAdapter.kt @@ -147,7 +147,6 @@ abstract class RealmBaseTasksRecyclerViewAdapter(privat if (taskFilterHelper != null) { val query = taskFilterHelper.createQuery(unfilteredData) updateData(query.findAllSorted("position")) - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt index b22105909..9e334d216 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt @@ -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 {