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
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wearos/src/main/res/layout/spinner_item.xml b/wearos/src/main/res/layout/spinner_item.xml
new file mode 100644
index 000000000..ef0272696
--- /dev/null
+++ b/wearos/src/main/res/layout/spinner_item.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file