From d5d9f6f39e357e5aa009af23d56d37563ca3e106 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 14 Jun 2022 16:20:06 +0200 Subject: [PATCH] very basic task form --- Habitica/res/values/strings.xml | 7 --- common/src/main/res/values/strings.xml | 7 +++ .../wearos/habitica/data/ApiClient.kt | 3 +- .../data/repositories/TaskLocalRepository.kt | 7 ++- .../data/repositories/TaskRepository.kt | 7 +++ .../wearos/habitica/models/tasks/Task.kt | 1 - .../ui/activities/TaskFormActivity.kt | 51 +++++++++++++++++++ .../ui/activities/TaskListActivity.kt | 4 +- .../ui/viewmodels/TaskFormViewModel.kt | 24 +++++++-- .../main/res/layout/activity_task_form.xml | 44 ++++++++++++++-- wearos/src/main/res/layout/spinner_item.xml | 10 ++++ 11 files changed, 147 insertions(+), 18 deletions(-) create mode 100644 wearos/src/main/res/layout/spinner_item.xml diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 10e95789d..2920eaa6b 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -420,10 +420,6 @@ Remove Keep My Challenges - Daily - Habit - Reward - To Do Official Challenge You’re not part of any Challenges right now! @@ -835,7 +831,6 @@ Switch to list view Switch to grid view Confirm deletion - Create %s Details Share Challenge with App Theme @@ -1019,8 +1014,6 @@ Your Progress Let\'s get started %d%% Complete - Create a Task - Complete a Task Hatch a new pet Feed a pet Purchase Equipment diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index a8e8ef357..6e7b251e0 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -19,6 +19,10 @@ Dailies To Do\'s Rewards + Daily + Habit + Reward + To Do Stats Settings New Task @@ -47,4 +51,7 @@ %d To do\'s %d Rewards + Create a Task + Complete a Task + Create %s \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt index 8791076d0..d30b1865e 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt @@ -8,6 +8,7 @@ import com.habitrpg.common.habitica.api.Server import com.habitrpg.common.habitica.models.auth.UserAuth import com.habitrpg.common.habitica.models.auth.UserAuthSocial import com.habitrpg.wearos.habitica.models.WearableHabitResponse +import com.habitrpg.wearos.habitica.models.tasks.Task import okhttp3.Cache import okhttp3.OkHttpClient import okhttp3.Request @@ -111,5 +112,5 @@ class ApiClient @Inject constructor( suspend fun getTasks() = process(apiService.getTasks()) suspend fun scoreTask(id: String, direction: String) = process(apiService.scoreTask(id, direction)) - + suspend fun createTask(task: Task) = process(apiService.createTask(task)) } \ No newline at end of file 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 4f7a3361a..1df2dace4 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 @@ -42,8 +42,11 @@ class TaskLocalRepository @Inject constructor() { fun updateTask(task: Task) { val oldList = tasks[task.type]?.value?.toMutableList() - oldList?.indexOfFirst { task.id == it.id }?.let { index -> - oldList.set(index, task) + val index = oldList?.indexOfFirst { task.id == it.id } + if (index != null && index >= 0) { + oldList[index] = task + } else { + oldList?.add(0, task) } tasks[task.type]?.value = oldList } 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 6c86f520c..e0640a1be 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 @@ -34,4 +34,11 @@ class TaskRepository @Inject constructor(val apiClient: ApiClient, val localRepo if (taskID == null) return emptyFlow() return localRepository.getTask(taskID) } + + suspend fun createTask(task: Task) { + val newTask = apiClient.createTask(task) + if (newTask != null) { + localRepository.updateTask(newTask) + } + } } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt index eed3e036f..cd55a75e1 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/tasks/Task.kt @@ -248,7 +248,6 @@ open class Task constructor(): Parcelable { } fun isBeingEdited(task: Task): Boolean { - when { text != task.text -> return true notes != task.notes -> return true diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt index 870c0ca7c..263cca2af 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt @@ -1,17 +1,68 @@ package com.habitrpg.wearos.habitica.ui.activities +import android.app.AlertDialog import android.os.Bundle +import android.widget.ArrayAdapter import androidx.activity.viewModels +import androidx.core.view.isVisible +import androidx.core.widget.doOnTextChanged +import androidx.lifecycle.lifecycleScope +import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.ActivityTaskFormBinding +import com.habitrpg.common.habitica.models.tasks.TaskType import com.habitrpg.wearos.habitica.ui.viewmodels.TaskFormViewModel import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch @AndroidEntryPoint class TaskFormActivity: BaseActivity() { + var taskType: TaskType? = null + set(value) { + field = value + binding.taskTypeButton.text = value?.value + } override val viewModel: TaskFormViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { binding = ActivityTaskFormBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) + + + binding.editText.doOnTextChanged { text, _, _, _ -> + binding.saveButton.isEnabled = text?.isNotBlank() == true + } + binding.taskTypeButton.setOnClickListener { + showTaskTypeSelector() + } + binding.saveButton.setOnClickListener { + binding.saveButton.isEnabled = false + lifecycleScope.launch { + viewModel.saveTask(binding.editText.text, taskType) + finish() + } + } + if (intent.extras?.containsKey("task_type") == true) { + taskType = TaskType.from(intent.getStringExtra("task_type")) + binding.taskTypeButton.isVisible = false + binding.header.textView.text = getString(R.string.create_task, taskType?.value) + } else { + taskType = TaskType.TODO + binding.header.textView.text = getString(R.string.create_task_title) + } + } + + private fun showTaskTypeSelector() { + val taskTypes = arrayOf( + TaskType.HABIT, + TaskType.DAILY, + TaskType.TODO, + TaskType.REWARD + ) + val adapter = ArrayAdapter(this, R.layout.spinner_item, taskTypes) + val alert = AlertDialog.Builder(this).setAdapter(adapter) { _, which -> + taskType = taskTypes[which] + binding.taskTypeButton.text = taskType?.value + } + alert.show() } } \ 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 f1944230f..904de10a7 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 @@ -85,7 +85,9 @@ class TaskListActivity: BaseActivity } private fun openTaskFormActivity() { - startActivity(Intent(this, TaskFormActivity::class.java)) + startActivity(Intent(this, TaskFormActivity::class.java).apply { + putExtra("task_type", viewModel.taskType?.value) + }) } private fun configureAdapter() { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskFormViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskFormViewModel.kt index 5ee7ca05c..1831c218f 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskFormViewModel.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskFormViewModel.kt @@ -1,15 +1,33 @@ package com.habitrpg.wearos.habitica.ui.viewmodels +import androidx.lifecycle.SavedStateHandle +import com.habitrpg.common.habitica.models.tasks.Frequency +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 javax.inject.Inject @HiltViewModel -class TaskFormViewModel @Inject constructor(userRepository: UserRepository, - taskRepository: TaskRepository, +class TaskFormViewModel @Inject constructor( + savedStateHandle: SavedStateHandle, + userRepository: UserRepository, + val taskRepository: TaskRepository, exceptionBuilder: ExceptionHandlerBuilder ) : BaseViewModel(userRepository, exceptionBuilder) { - + suspend fun saveTask(text: CharSequence?, taskType: TaskType?) { + if (text?.isNotBlank() != true || taskType == null) { + return + } + val task = Task() + task.text = text.toString() + task.type = taskType + task.priority = 1.0f + task.up = true + task.everyX = 1 + task.frequency = Frequency.DAILY + taskRepository.createTask(task) + } } \ No newline at end of file diff --git a/wearos/src/main/res/layout/activity_task_form.xml b/wearos/src/main/res/layout/activity_task_form.xml index d829e291c..aa3983694 100644 --- a/wearos/src/main/res/layout/activity_task_form.xml +++ b/wearos/src/main/res/layout/activity_task_form.xml @@ -1,7 +1,45 @@ - - - \ No newline at end of file + + + + + +