mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-07-13 17:51:57 +00:00
very basic task form
This commit is contained in:
parent
6e8d73b887
commit
d5d9f6f39e
11 changed files with 147 additions and 18 deletions
|
|
@ -420,10 +420,6 @@
|
||||||
<string name="remove_tasks">Remove</string>
|
<string name="remove_tasks">Remove</string>
|
||||||
<string name="keep_tasks">Keep</string>
|
<string name="keep_tasks">Keep</string>
|
||||||
<string name="my_challenges">My Challenges</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="official">Official</string>
|
||||||
<string name="challenge">Challenge</string>
|
<string name="challenge">Challenge</string>
|
||||||
<string name="not_part_of_a_challenge">You’re not part of any Challenges right now!</string>
|
<string name="not_part_of_a_challenge">You’re 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_list_view">Switch to list view</string>
|
||||||
<string name="switch_to_grid_view">Switch to grid view</string>
|
<string name="switch_to_grid_view">Switch to grid view</string>
|
||||||
<string name="confirm_deletion">Confirm deletion</string>
|
<string name="confirm_deletion">Confirm deletion</string>
|
||||||
<string name="create_task">Create %s</string>
|
|
||||||
<string name="details">Details</string>
|
<string name="details">Details</string>
|
||||||
<string name="share_challenge_with">Share Challenge with</string>
|
<string name="share_challenge_with">Share Challenge with</string>
|
||||||
<string name="app_theme">App Theme</string>
|
<string name="app_theme">App Theme</string>
|
||||||
|
|
@ -1019,8 +1014,6 @@
|
||||||
<string name="your_progress">Your Progress</string>
|
<string name="your_progress">Your Progress</string>
|
||||||
<string name="lets_get_started">Let\'s get started</string>
|
<string name="lets_get_started">Let\'s get started</string>
|
||||||
<string name="percent_completed">%d%% Complete</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="hatch_pet_title">Hatch a new pet</string>
|
||||||
<string name="feedPet_title">Feed a pet</string>
|
<string name="feedPet_title">Feed a pet</string>
|
||||||
<string name="purchase_equipment_title">Purchase Equipment</string>
|
<string name="purchase_equipment_title">Purchase Equipment</string>
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,10 @@
|
||||||
<string name="dailies">Dailies</string>
|
<string name="dailies">Dailies</string>
|
||||||
<string name="todos">To Do\'s</string>
|
<string name="todos">To Do\'s</string>
|
||||||
<string name="rewards">Rewards</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="stats">Stats</string>
|
||||||
<string name="settings">Settings</string>
|
<string name="settings">Settings</string>
|
||||||
<string name="new_task">New Task</string>
|
<string name="new_task">New Task</string>
|
||||||
|
|
@ -47,4 +51,7 @@
|
||||||
<string name="x_todos">%d To do\'s</string>
|
<string name="x_todos">%d To do\'s</string>
|
||||||
<string name="x_rewards">%d Rewards</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>
|
</resources>
|
||||||
|
|
@ -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.UserAuth
|
||||||
import com.habitrpg.common.habitica.models.auth.UserAuthSocial
|
import com.habitrpg.common.habitica.models.auth.UserAuthSocial
|
||||||
import com.habitrpg.wearos.habitica.models.WearableHabitResponse
|
import com.habitrpg.wearos.habitica.models.WearableHabitResponse
|
||||||
|
import com.habitrpg.wearos.habitica.models.tasks.Task
|
||||||
import okhttp3.Cache
|
import okhttp3.Cache
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
|
@ -111,5 +112,5 @@ class ApiClient @Inject constructor(
|
||||||
|
|
||||||
suspend fun getTasks() = process(apiService.getTasks())
|
suspend fun getTasks() = process(apiService.getTasks())
|
||||||
suspend fun scoreTask(id: String, direction: String) = process(apiService.scoreTask(id, direction))
|
suspend fun scoreTask(id: String, direction: String) = process(apiService.scoreTask(id, direction))
|
||||||
|
suspend fun createTask(task: Task) = process(apiService.createTask(task))
|
||||||
}
|
}
|
||||||
|
|
@ -42,8 +42,11 @@ class TaskLocalRepository @Inject constructor() {
|
||||||
|
|
||||||
fun updateTask(task: Task) {
|
fun updateTask(task: Task) {
|
||||||
val oldList = tasks[task.type]?.value?.toMutableList()
|
val oldList = tasks[task.type]?.value?.toMutableList()
|
||||||
oldList?.indexOfFirst { task.id == it.id }?.let { index ->
|
val index = oldList?.indexOfFirst { task.id == it.id }
|
||||||
oldList.set(index, task)
|
if (index != null && index >= 0) {
|
||||||
|
oldList[index] = task
|
||||||
|
} else {
|
||||||
|
oldList?.add(0, task)
|
||||||
}
|
}
|
||||||
tasks[task.type]?.value = oldList
|
tasks[task.type]?.value = oldList
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,4 +34,11 @@ class TaskRepository @Inject constructor(val apiClient: ApiClient, val localRepo
|
||||||
if (taskID == null) return emptyFlow()
|
if (taskID == null) return emptyFlow()
|
||||||
return localRepository.getTask(taskID)
|
return localRepository.getTask(taskID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun createTask(task: Task) {
|
||||||
|
val newTask = apiClient.createTask(task)
|
||||||
|
if (newTask != null) {
|
||||||
|
localRepository.updateTask(newTask)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -248,7 +248,6 @@ open class Task constructor(): Parcelable {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isBeingEdited(task: Task): Boolean {
|
fun isBeingEdited(task: Task): Boolean {
|
||||||
|
|
||||||
when {
|
when {
|
||||||
text != task.text -> return true
|
text != task.text -> return true
|
||||||
notes != task.notes -> return true
|
notes != task.notes -> return true
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,68 @@
|
||||||
package com.habitrpg.wearos.habitica.ui.activities
|
package com.habitrpg.wearos.habitica.ui.activities
|
||||||
|
|
||||||
|
import android.app.AlertDialog
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.widget.ArrayAdapter
|
||||||
import androidx.activity.viewModels
|
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.android.habitica.databinding.ActivityTaskFormBinding
|
||||||
|
import com.habitrpg.common.habitica.models.tasks.TaskType
|
||||||
import com.habitrpg.wearos.habitica.ui.viewmodels.TaskFormViewModel
|
import com.habitrpg.wearos.habitica.ui.viewmodels.TaskFormViewModel
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class TaskFormActivity: BaseActivity<ActivityTaskFormBinding, TaskFormViewModel>() {
|
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 val viewModel: TaskFormViewModel by viewModels()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
binding = ActivityTaskFormBinding.inflate(layoutInflater)
|
binding = ActivityTaskFormBinding.inflate(layoutInflater)
|
||||||
super.onCreate(savedInstanceState)
|
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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -85,7 +85,9 @@ class TaskListActivity: BaseActivity<ActivityTasklistBinding, TaskListViewModel>
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openTaskFormActivity() {
|
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() {
|
private fun configureAdapter() {
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,33 @@
|
||||||
package com.habitrpg.wearos.habitica.ui.viewmodels
|
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.TaskRepository
|
||||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||||
|
import com.habitrpg.wearos.habitica.models.tasks.Task
|
||||||
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
|
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class TaskFormViewModel @Inject constructor(userRepository: UserRepository,
|
class TaskFormViewModel @Inject constructor(
|
||||||
taskRepository: TaskRepository,
|
savedStateHandle: SavedStateHandle,
|
||||||
|
userRepository: UserRepository,
|
||||||
|
val taskRepository: TaskRepository,
|
||||||
exceptionBuilder: ExceptionHandlerBuilder
|
exceptionBuilder: ExceptionHandlerBuilder
|
||||||
) : BaseViewModel(userRepository, exceptionBuilder) {
|
) : 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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,45 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?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:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
<androidx.wear.widget.BoxInsetLayout
|
||||||
</LinearLayout>
|
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>
|
||||||
10
wearos/src/main/res/layout/spinner_item.xml
Normal file
10
wearos/src/main/res/layout/spinner_item.xml
Normal 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>
|
||||||
Loading…
Reference in a new issue