Fix task reordering. Fixes #967

This commit is contained in:
Phillip Thelen 2018-08-27 14:17:30 +02:00
parent 624eb99d37
commit 81f41f95da
8 changed files with 26 additions and 17 deletions

View file

@ -42,7 +42,7 @@ interface TaskRepository : BaseRepository {
fun swapTaskPosition(firstPosition: Int, secondPosition: Int)
fun updateTaskPosition(taskType: String, oldPosition: Int, newPosition: Int): Maybe<List<String>>
fun updateTaskPosition(taskType: String, taskID: String, newPosition: Int): Maybe<List<String>>
fun getUnmanagedTask(taskid: String): Flowable<Task>

View file

@ -214,16 +214,8 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
localRepository.swapTaskPosition(firstPosition, secondPosition)
}
override fun updateTaskPosition(taskType: String, oldPosition: Int, newPosition: Int): Maybe<List<String>> {
return localRepository.getTaskAtPosition(taskType, oldPosition)
.firstElement()
.flatMap { task ->
return@flatMap if (task.isValid) {
apiClient.postTaskNewPosition(task.id ?: "", newPosition).firstElement()
} else {
Maybe.just<List<String>>(ArrayList())
}
}
override fun updateTaskPosition(taskType: String, taskID: String, newPosition: Int): Maybe<List<String>> {
return apiClient.postTaskNewPosition(taskID, newPosition).firstElement()
.doOnSuccess { localRepository.updateTaskPositions(it) }
}

View file

@ -198,7 +198,7 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm),
override fun updateTaskPositions(taskOrder: List<String>) {
if (taskOrder.isNotEmpty()) {
val tasks = realm.where(Task::class.java).`in`("id", taskOrder.toTypedArray()).findAll()
realm.executeTransaction {
realm.executeTransaction { _ ->
tasks.filter { taskOrder.contains(it.id) }.forEach { it.position = taskOrder.indexOf(it.id) }
}
}

View file

@ -109,7 +109,7 @@ class TaskFilterHelper {
Task.FILTER_GRAY -> query = query.equalTo("completed", true).or().equalTo("isDue", false)
Task.FILTER_WEAK -> query = query.lessThan("value", 0.0)
Task.FILTER_STRONG -> query = query.greaterThanOrEqualTo("value", 0.0)
Task.FILTER_DATED -> query = query.isNotNull("dueDate")
Task.FILTER_DATED -> query = query.isNotNull("dueDate").equalTo("completed", false)
Task.FILTER_COMPLETED -> query = query.equalTo("completed", true)
}
}

View file

@ -154,4 +154,8 @@ abstract class RealmBaseTasksRecyclerViewAdapter<VH : BaseTaskViewHolder>(privat
override fun setIgnoreUpdates(ignoreUpdates: Boolean) {
this.ignoreUpdates = ignoreUpdates
}
override fun getTaskIDAt(position: Int): String {
return data?.get(position)?.id ?: ""
}
}

View file

@ -126,4 +126,9 @@ public class RewardsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVie
@Override
public void filter() {
}
@Override
public String getTaskIDAt(int position) {
return customRewards.get(position).getId();
}
}

View file

@ -16,6 +16,7 @@ public interface TaskRecyclerViewAdapter {
void notifyItemMoved(int adapterPosition, int adapterPosition1);
void notifyDataSetChanged();
int getItemViewType(int position);
String getTaskIDAt(int position);
void setIgnoreUpdates(boolean ignoreUpdates);
boolean getIgnoreUpdates();

View file

@ -27,6 +27,7 @@ import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.android.habitica.ui.adapter.tasks.*
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
import com.habitrpg.android.habitica.ui.viewHolders.tasks.BaseTaskViewHolder
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.fragment_refresh_recyclerview.*
@ -110,6 +111,7 @@ open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, Swip
mItemTouchCallback = object : ItemTouchHelper.Callback() {
private var fromPosition: Int? = null
private var movingTaskID: String? = null
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
super.onSelectedChanged(viewHolder, actionState)
@ -118,6 +120,9 @@ open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, Swip
if (fromPosition == null) {
fromPosition = viewHolder.adapterPosition
}
if (movingTaskID == null) {
movingTaskID = (viewHolder as? BaseTaskViewHolder)?.task?.id
}
}
refreshLayout.isEnabled = false
}
@ -145,15 +150,17 @@ open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, Swip
refreshLayout?.isEnabled = true
val fromPosition = fromPosition
if (fromPosition != null) {
val movingTaskID = movingTaskID
if (fromPosition != null && movingTaskID != null) {
recyclerAdapter?.ignoreUpdates = true
taskRepository.updateTaskPosition(classType ?: "", fromPosition, viewHolder.adapterPosition)
taskRepository.updateTaskPosition(classType ?: "", movingTaskID, viewHolder.adapterPosition)
.delay(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer { recyclerAdapter?.ignoreUpdates = false
recyclerAdapter?.notifyDataSetChanged()}, RxErrorHandler.handleEmptyError())
this.fromPosition = null
}
this.fromPosition = null
this.movingTaskID = null
}
}
if (savedInstanceState != null) {
@ -177,7 +184,7 @@ open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, Swip
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerView.adapter = recyclerAdapter as RecyclerView.Adapter<*>?
recyclerView.adapter = recyclerAdapter as? RecyclerView.Adapter<*>
recyclerAdapter?.filter()
layoutManager = recyclerView.layoutManager