From 1f22d10b673cf4720b1a1552516deb028f2a678e Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 7 Jun 2022 12:35:53 +0200 Subject: [PATCH] very very basic task checking off --- .../data/repositories/TaskLocalRepository.kt | 8 +++++ .../data/repositories/TaskRepository.kt | 15 ++++---- .../ui/activities/TaskListActivity.kt | 36 +++++++++++++++++++ .../habitica/ui/adapters/TaskListAdapter.kt | 4 +++ .../ui/viewHolders/tasks/DailyViewHolder.kt | 13 +++++-- .../ui/viewHolders/tasks/HabitViewHolder.kt | 9 +++++ .../ui/viewHolders/tasks/TaskViewHolder.kt | 3 +- .../ui/viewHolders/tasks/ToDoViewHolder.kt | 10 ++++++ .../ui/viewmodels/TaskListViewModel.kt | 11 ++++++ wearos/src/main/res/drawable/circle.xml | 4 +++ wearos/src/main/res/drawable/daily_square.xml | 6 ++++ wearos/src/main/res/layout/row_daily.xml | 6 ++++ wearos/src/main/res/layout/row_habit.xml | 7 ++++ wearos/src/main/res/layout/row_todo.xml | 6 ++++ 14 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 wearos/src/main/res/drawable/circle.xml create mode 100644 wearos/src/main/res/drawable/daily_square.xml diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt index 5650d5687..e538140e2 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt @@ -38,4 +38,12 @@ class TaskLocalRepository @Inject constructor() { this.tasks[type.key]?.value = type.value } } + + fun updateTask(task: Task) { + val oldList = tasks[task.type]?.value?.toMutableList() + oldList?.indexOfFirst { task.id == it.id }?.let { index -> + oldList.set(index, task) + } + tasks[task.type]?.value = oldList + } } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt index 61ac2af02..973f058f3 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt @@ -1,6 +1,7 @@ package com.habitrpg.wearos.habitica.data.repositories import com.habitrpg.common.habitica.models.responses.TaskDirection +import com.habitrpg.common.habitica.models.responses.TaskScoringResult import com.habitrpg.common.habitica.models.tasks.TaskType import com.habitrpg.wearos.habitica.data.ApiClient import com.habitrpg.wearos.habitica.models.tasks.Task @@ -17,12 +18,14 @@ class TaskRepository @Inject constructor(val apiClient: ApiClient, val localRepo } fun getTasks(taskType: TaskType): Flow> = localRepository.getTasks(taskType) - suspend fun scoreTask(taskID: String, direction: TaskDirection) { - val response = apiClient.scoreTask(taskID, direction.text) - } - suspend fun scoreTask(task: Task, direction: TaskDirection) { - val id = task.id ?: return - val response = scoreTask(id, direction) + suspend fun scoreTask(task: Task, direction: TaskDirection): TaskScoringResult? { + val id = task.id ?: return null + val result = apiClient.scoreTask(id, direction.text) + if (result != null) { + task.completed = direction == TaskDirection.UP + localRepository.updateTask(task) + } + return result?.let { TaskScoringResult(it, null) } } } \ No newline at end of file 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 543107776..e06016fde 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 @@ -1,11 +1,16 @@ package com.habitrpg.wearos.habitica.ui.activities +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels +import androidx.wear.activity.ConfirmationActivity import androidx.wear.widget.WearableLinearLayoutManager +import com.habitrpg.common.habitica.models.responses.TaskDirection +import com.habitrpg.common.habitica.models.responses.TaskScoringResult import com.habitrpg.common.habitica.models.tasks.TaskType import com.habitrpg.wearos.habitica.R import com.habitrpg.wearos.habitica.databinding.ActivityTasklistBinding +import com.habitrpg.wearos.habitica.models.tasks.Task import com.habitrpg.wearos.habitica.ui.adapters.DailyListAdapter import com.habitrpg.wearos.habitica.ui.adapters.HabitListAdapter import com.habitrpg.wearos.habitica.ui.adapters.RewardListAdapter @@ -33,6 +38,37 @@ class TaskListActivity: BaseActivity viewModel.tasks.observe(this) { adapter.data = it } + + adapter.onTaskScore = { + scoreTask(it) + } + } + + private fun scoreTask(task: Task) { + var direction = TaskDirection.UP + if (task.type == TaskType.HABIT) { + if (task.up == true && task.down == true) { + return + } else { + direction = if (task.up == true) TaskDirection.UP else TaskDirection.DOWN + } + } else if (task.completed) { + direction = TaskDirection.DOWN + } + viewModel.scoreTask(task, direction) { + if (it != null) { + showTaskScoringResult(it) + } + } + } + + private fun showTaskScoringResult(result: TaskScoringResult) { + val intent = Intent(this, ConfirmationActivity::class.java).apply { + putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE, ConfirmationActivity.SUCCESS_ANIMATION) + putExtra(ConfirmationActivity.EXTRA_MESSAGE, result.experienceDelta?.toString()) + putExtra(ConfirmationActivity.EXTRA_ANIMATION_DURATION_MILLIS, 3000) + } + startActivity(intent) } private fun configureAdapter() { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt index a8f598575..3b4c61c10 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/TaskListAdapter.kt @@ -10,6 +10,7 @@ import com.habitrpg.wearos.habitica.ui.viewHolders.tasks.TaskViewHolder open class TaskListAdapter(): RecyclerView.Adapter() { var title: String = "" + var onTaskScore: ((Task) -> Unit)? = null var data: List = listOf() set(value) { field = value @@ -24,6 +25,9 @@ open class TaskListAdapter(): RecyclerView.Adapter() { if (holder is TaskViewHolder) { val item = data[position - 1] holder.bind(item) + holder.onTaskScore = { + onTaskScore?.invoke(item) + } } else if (holder is HeaderViewHolder){ holder.bind(title) } diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/DailyViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/DailyViewHolder.kt index e5fdc1a09..a5b993cd7 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/DailyViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/DailyViewHolder.kt @@ -1,16 +1,25 @@ package com.habitrpg.wearos.habitica.ui.viewHolders.tasks +import android.content.res.ColorStateList import android.view.View import android.widget.TextView -import com.habitrpg.wearos.habitica.databinding.RowHabitBinding +import androidx.core.content.ContextCompat +import com.habitrpg.wearos.habitica.databinding.RowDailyBinding import com.habitrpg.wearos.habitica.models.tasks.Task class DailyViewHolder(itemView: View) : TaskViewHolder(itemView) { - private val binding = RowHabitBinding.bind(itemView) + private val binding = RowDailyBinding.bind(itemView) override val titleView: TextView get() = binding.title + init { + binding.checkbox.setOnCheckedChangeListener { buttonView, isChecked -> + onTaskScore?.invoke() + } + } + override fun bind(data: Task) { super.bind(data) + binding.checkbox.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, data.mediumTaskColor)) } } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/HabitViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/HabitViewHolder.kt index 011fb1299..b8c99fed4 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/HabitViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/HabitViewHolder.kt @@ -1,7 +1,9 @@ package com.habitrpg.wearos.habitica.ui.viewHolders.tasks +import android.content.res.ColorStateList import android.view.View import android.widget.TextView +import androidx.core.content.ContextCompat import com.habitrpg.wearos.habitica.databinding.RowHabitBinding import com.habitrpg.wearos.habitica.models.tasks.Task @@ -10,7 +12,14 @@ class HabitViewHolder(itemView: View) : TaskViewHolder(itemView) { override val titleView: TextView get() = binding.title + init { + binding.habitButton.setOnClickListener { + onTaskScore?.invoke() + } + } + override fun bind(data: Task) { super.bind(data) + binding.habitButton.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, data.mediumTaskColor)) } } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/TaskViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/TaskViewHolder.kt index 9dd3af23d..0a5ca0c18 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/TaskViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/TaskViewHolder.kt @@ -2,12 +2,11 @@ package com.habitrpg.wearos.habitica.ui.viewHolders.tasks import android.view.View import android.widget.TextView -import com.habitrpg.common.habitica.models.responses.TaskDirection import com.habitrpg.wearos.habitica.models.tasks.Task import com.habitrpg.wearos.habitica.ui.viewHolders.BindableViewHolder abstract class TaskViewHolder(itemView: View) : BindableViewHolder(itemView) { - var onTaskScored: ((TaskDirection) -> Unit)? = null + var onTaskScore: (() -> Unit)? = null abstract val titleView: TextView override fun bind(data: Task) { titleView.text = data.text diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/ToDoViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/ToDoViewHolder.kt index 7086bf8f2..41e665bba 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/ToDoViewHolder.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/tasks/ToDoViewHolder.kt @@ -1,7 +1,9 @@ package com.habitrpg.wearos.habitica.ui.viewHolders.tasks +import android.content.res.ColorStateList import android.view.View import android.widget.TextView +import androidx.core.content.ContextCompat import com.habitrpg.wearos.habitica.databinding.RowTodoBinding import com.habitrpg.wearos.habitica.models.tasks.Task @@ -9,7 +11,15 @@ class ToDoViewHolder(itemView: View) : TaskViewHolder(itemView) { private val binding = RowTodoBinding.bind(itemView) override val titleView: TextView get() = binding.title + + init { + binding.checkbox.setOnCheckedChangeListener { buttonView, isChecked -> + onTaskScore?.invoke() + } + } + override fun bind(data: Task) { super.bind(data) + binding.checkbox.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, data.mediumTaskColor)) } } \ No newline at end of file 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 716a36442..697898af4 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 @@ -3,12 +3,16 @@ package com.habitrpg.wearos.habitica.ui.viewmodels import androidx.lifecycle.LiveData import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.asLiveData +import androidx.lifecycle.viewModelScope +import com.habitrpg.common.habitica.models.responses.TaskDirection +import com.habitrpg.common.habitica.models.responses.TaskScoringResult import com.habitrpg.common.habitica.models.tasks.TaskType import com.habitrpg.wearos.habitica.data.repositories.TaskRepository import com.habitrpg.wearos.habitica.data.repositories.UserRepository import com.habitrpg.wearos.habitica.models.tasks.Task import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -18,6 +22,13 @@ class TaskListViewModel @Inject constructor( userRepository: UserRepository, exceptionBuilder: ExceptionHandlerBuilder ) : BaseViewModel(userRepository, exceptionBuilder) { + fun scoreTask(task: Task, direction: TaskDirection, onResult: (TaskScoringResult?) -> Unit) { + viewModelScope.launch(exceptionBuilder.userFacing(this)) { + val result = taskRepository.scoreTask(task, direction) + onResult(result) + } + } + var tasks: LiveData> val taskType = TaskType.from(savedStateHandle.get("task_type")) diff --git a/wearos/src/main/res/drawable/circle.xml b/wearos/src/main/res/drawable/circle.xml new file mode 100644 index 000000000..ff997810b --- /dev/null +++ b/wearos/src/main/res/drawable/circle.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/wearos/src/main/res/drawable/daily_square.xml b/wearos/src/main/res/drawable/daily_square.xml new file mode 100644 index 000000000..954ecadf9 --- /dev/null +++ b/wearos/src/main/res/drawable/daily_square.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/wearos/src/main/res/layout/row_daily.xml b/wearos/src/main/res/layout/row_daily.xml index 176fe4dd4..b08d0fadd 100644 --- a/wearos/src/main/res/layout/row_daily.xml +++ b/wearos/src/main/res/layout/row_daily.xml @@ -7,6 +7,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/Chip"> + + +