mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 19:56:32 +00:00
Fix task reordering. Fixes #967
This commit is contained in:
parent
624eb99d37
commit
81f41f95da
8 changed files with 26 additions and 17 deletions
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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) }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ?: ""
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue