diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt index 64eb0da9b..65cc152bd 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt @@ -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() { var onTaskScore: ((Task) -> Unit)? = null var onTaskTapped:((Task) -> Unit)? = null var onRefresh:(() -> Unit)? = null - var data: List = listOf() + var data: List = listOf() set(value) { field = value notifyDataSetChanged() @@ -25,7 +25,7 @@ open class TaskListAdapter(): RecyclerView.Adapter() { 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() { 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 { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/RYAViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/RYAViewModel.kt index 60ba41040..f2779520c 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/RYAViewModel.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/RYAViewModel.kt @@ -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>() private val tasksToComplete = mutableListOf() + 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) diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt index 456d371f5..ca21b337e 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt @@ -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("task_type")) - val tasks = taskRepository.getTasks(taskType ?: TaskType.HABIT).asLiveData() + val tasks = taskRepository.getTasks(taskType ?: TaskType.HABIT) + .map { + val taskList: MutableList = 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() diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskResultViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskResultViewModel.kt index f658f9aaa..f5f5b164a 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskResultViewModel.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskResultViewModel.kt @@ -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("result") }