mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 19:56:32 +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="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">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_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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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))
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
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