Improve task sorting

This commit is contained in:
Phillip Thelen 2022-06-29 13:51:41 +02:00
parent 7335ef240b
commit 0cf7fc7864
5 changed files with 42 additions and 13 deletions

View file

@ -3,6 +3,7 @@ package com.habitrpg.wearos.habitica.ui.activities
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.wear.widget.WearableLinearLayoutManager
@ -32,6 +33,7 @@ class TaskListActivity : BaseActivity<ActivityTasklistBinding, TaskListViewModel
super.onCreate(savedInstanceState)
configureAdapter()
binding.recyclerView.apply {
overScrollMode = View.OVER_SCROLL_ALWAYS
layoutManager =
WearableLinearLayoutManager(
this@TaskListActivity,

View file

@ -13,7 +13,7 @@ open class TaskListAdapter(): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var onTaskScore: ((Task) -> Unit)? = null
var onTaskTapped:((Task) -> Unit)? = null
var onRefresh:(() -> Unit)? = null
var data: List<Task> = listOf()
var data: List<Any> = listOf()
set(value) {
field = value
notifyDataSetChanged()
@ -25,7 +25,7 @@ open class TaskListAdapter(): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is TaskViewHolder) {
val item = data[position - 1]
val item = data[position - 1] as Task
holder.bind(item)
holder.onTaskScore = {
onTaskScore?.invoke(item)
@ -34,15 +34,24 @@ open class TaskListAdapter(): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
onTaskTapped?.invoke(item)
}
} else if (holder is HeaderSectionViewHolder){
holder.bind(title)
holder.itemView.setOnClickListener {
onRefresh?.invoke()
if (position == 0) {
holder.bind(title)
holder.itemView.setOnClickListener {
onRefresh?.invoke()
}
} else {
holder.bind(data[position - 1] as String)
}
}
}
override fun getItemViewType(position: Int): Int {
return if (position == 0) 0 else 1
return if (position == 0) {
0
} else {
val item = data[position - 1]
if (item is Task) 1 else 0
}
}
override fun getItemCount(): Int {

View file

@ -1,6 +1,6 @@
package com.habitrpg.wearos.habitica.ui.viewmodels
import androidx.lifecycle.asLiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.habitrpg.common.habitica.models.responses.TaskDirection
import com.habitrpg.common.habitica.models.tasks.TaskType
@ -10,6 +10,7 @@ import com.habitrpg.wearos.habitica.managers.LoadingManager
import com.habitrpg.wearos.habitica.models.tasks.Task
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import javax.inject.Inject
@ -20,15 +21,21 @@ class RYAViewModel @Inject constructor(
val taskRepository: TaskRepository,
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
val tasks = taskRepository.getTasks(TaskType.DAILY)
.map { it.filter { task -> task.isDue == true && !task.completed } }
.asLiveData()
val tasks = MutableLiveData<List<Task>>()
private val tasksToComplete = mutableListOf<Task>()
init {
viewModelScope.launch(exceptionBuilder.silent()) {
tasks.value = taskRepository.getTasks(TaskType.DAILY)
.map { it.filter { task -> task.isDue == true && !task.completed } }
.first()
}
}
fun tappedTask(task: Task) {
task.completed = !task.completed
// taskRepository.localRepository.updateTask(task)
tasks.value = tasks.value
if (task.completed) {
if (!tasksToComplete.contains(task)) {
tasksToComplete.add(task)

View file

@ -13,6 +13,7 @@ import com.habitrpg.wearos.habitica.models.tasks.Task
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import javax.inject.Inject
@ -24,7 +25,17 @@ class TaskListViewModel @Inject constructor(
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
val taskType = TaskType.from(savedStateHandle.get<String>("task_type"))
val tasks = taskRepository.getTasks(taskType ?: TaskType.HABIT).asLiveData()
val tasks = taskRepository.getTasks(taskType ?: TaskType.HABIT)
.map {
val taskList: MutableList<Any> = it.sortedBy { it.completed }.toMutableList()
var firstCompletedIndex = taskList.indexOfFirst { it is Task && it.completed }
if (firstCompletedIndex < 0) {
firstCompletedIndex = 0
}
taskList.add(firstCompletedIndex, "Done today")
taskList
}
.asLiveData()
val user = userRepository.getUser()
.asLiveData()

View file

@ -14,7 +14,7 @@ class TaskResultViewModel @Inject constructor(savedStateHandle: SavedStateHandle
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
val hasDrop: Boolean
get() {
return result?.drop?.key?.isNotBlank() == true || (result?.questItemsFound ?: 0) > 0
return result?.drop?.key?.isNotBlank() == true // || (result?.questItemsFound ?: 0) > 0
}
val result = savedStateHandle.get<TaskScoringResult>("result")
}