very basic task form

This commit is contained in:
Phillip Thelen 2022-06-14 16:20:06 +02:00
parent 6e8d73b887
commit d5d9f6f39e
11 changed files with 147 additions and 18 deletions

View file

@ -420,10 +420,6 @@
<string name="remove_tasks">Remove</string>
<string name="keep_tasks">Keep</string>
<string name="my_challenges">My Challenges</string>
<string name="daily">Daily</string>
<string name="habit">Habit</string>
<string name="reward">Reward</string>
<string name="todo">To Do</string>
<string name="official">Official</string>
<string name="challenge">Challenge</string>
<string name="not_part_of_a_challenge">Youre not part of any Challenges right now!</string>
@ -835,7 +831,6 @@
<string name="switch_to_list_view">Switch to list view</string>
<string name="switch_to_grid_view">Switch to grid view</string>
<string name="confirm_deletion">Confirm deletion</string>
<string name="create_task">Create %s</string>
<string name="details">Details</string>
<string name="share_challenge_with">Share Challenge with</string>
<string name="app_theme">App Theme</string>
@ -1019,8 +1014,6 @@
<string name="your_progress">Your Progress</string>
<string name="lets_get_started">Let\'s get started</string>
<string name="percent_completed">%d%% Complete</string>
<string name="create_task_title">Create a Task</string>
<string name="complete_task_title">Complete a Task</string>
<string name="hatch_pet_title">Hatch a new pet</string>
<string name="feedPet_title">Feed a pet</string>
<string name="purchase_equipment_title">Purchase Equipment</string>

View file

@ -19,6 +19,10 @@
<string name="dailies">Dailies</string>
<string name="todos">To Do\'s</string>
<string name="rewards">Rewards</string>
<string name="daily">Daily</string>
<string name="habit">Habit</string>
<string name="reward">Reward</string>
<string name="todo">To Do</string>
<string name="stats">Stats</string>
<string name="settings">Settings</string>
<string name="new_task">New Task</string>
@ -47,4 +51,7 @@
<string name="x_todos">%d To do\'s</string>
<string name="x_rewards">%d Rewards</string>
<string name="create_task_title">Create a Task</string>
<string name="complete_task_title">Complete a Task</string>
<string name="create_task">Create %s</string>
</resources>

View file

@ -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))
}

View file

@ -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
}

View file

@ -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)
}
}
}

View file

@ -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

View file

@ -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<ActivityTaskFormBinding, TaskFormViewModel>() {
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()
}
}

View file

@ -85,7 +85,9 @@ class TaskListActivity: BaseActivity<ActivityTasklistBinding, TaskListViewModel>
}
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() {

View file

@ -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)
}
}

View file

@ -1,7 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
<androidx.wear.widget.BoxInsetLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_boxedEdges="all">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="38dp"
android:orientation="vertical">
<include
android:id="@+id/header"
layout="@layout/row_header" />
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:importantForAutofill="no"
android:inputType="textCapWords" />
<Button
android:id="@+id/task_type_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Chip"
tools:text="Task Type"
android:textAllCaps="false"
android:textColor="@color/brand_500"/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.wear.widget.BoxInsetLayout>
<com.habitrpg.wearos.habitica.ui.views.AddTaskButton
android:id="@+id/save_button"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_gravity="bottom" />
</FrameLayout>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="@color/white"
android:textSize="18sp">
</TextView>