diff --git a/Habitica/res/drawable/ic_arrow_drop_down_gray_48dp.xml b/Habitica/res/drawable/ic_arrow_drop_down_gray_48dp.xml
new file mode 100644
index 000000000..160f55139
--- /dev/null
+++ b/Habitica/res/drawable/ic_arrow_drop_down_gray_48dp.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Habitica/res/drawable/ic_arrow_drop_down_gray_48dp_disabled.xml b/Habitica/res/drawable/ic_arrow_drop_down_gray_48dp_disabled.xml
new file mode 100644
index 000000000..47968387d
--- /dev/null
+++ b/Habitica/res/drawable/ic_arrow_drop_down_gray_48dp_disabled.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Habitica/res/drawable/ic_arrow_drop_down_gray_48dp_states.xml b/Habitica/res/drawable/ic_arrow_drop_down_gray_48dp_states.xml
new file mode 100644
index 000000000..4e7b321f4
--- /dev/null
+++ b/Habitica/res/drawable/ic_arrow_drop_down_gray_48dp_states.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/ic_arrow_drop_up_gray_48dp.xml b/Habitica/res/drawable/ic_arrow_drop_up_gray_48dp.xml
new file mode 100644
index 000000000..94bcd8d77
--- /dev/null
+++ b/Habitica/res/drawable/ic_arrow_drop_up_gray_48dp.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Habitica/res/layout/activity_task_form.xml b/Habitica/res/layout/activity_task_form.xml
index bbb97492e..87f537f42 100644
--- a/Habitica/res/layout/activity_task_form.xml
+++ b/Habitica/res/layout/activity_task_form.xml
@@ -74,6 +74,16 @@
android:id="@+id/habit_scoring_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt
index d4736a938..1fd4deb8a 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt
@@ -75,6 +75,9 @@ class TaskFormActivity : BaseActivity() {
private val statConstitutionButton: TextView by bindView(R.id.stat_constitution_button)
private val statPerceptionButton: TextView by bindView(R.id.stat_perception_button)
+ private val rewardValueTitleView: TextView by bindView(R.id.reward_value_title)
+ private val rewardValueFormView: RewardValueFormView by bindView(R.id.reward_value)
+
private val tagsWrapper: LinearLayout by bindView(R.id.tags_wrapper)
private var isCreating = true
@@ -189,13 +192,17 @@ class TaskFormActivity : BaseActivity() {
remindersTitleView.visibility = todoDailyViewsVisibility
remindersContainer.visibility = todoDailyViewsVisibility
+ taskSchedulingTitleView.visibility = todoDailyViewsVisibility
+ taskSchedulingControls.visibility = todoDailyViewsVisibility
+ taskSchedulingControls.taskType = taskType
+
val rewardHideViews = if (taskType == Task.TYPE_REWARD) View.GONE else View.VISIBLE
taskDifficultyTitleView.visibility = rewardHideViews
taskDifficultyButtons.visibility = rewardHideViews
- taskSchedulingTitleView.visibility = todoDailyViewsVisibility
- taskSchedulingControls.visibility = todoDailyViewsVisibility
- taskSchedulingControls.taskType = taskType
+ val rewardViewsVisibility = if (taskType == Task.TYPE_REWARD) View.VISIBLE else View.GONE
+ rewardValueTitleView.visibility = rewardViewsVisibility
+ rewardValueFormView.visibility = rewardViewsVisibility
statWrapper.visibility = if (usesTaskAttributeStats) View.VISIBLE else View.GONE
if (isCreating) {
@@ -246,6 +253,7 @@ class TaskFormActivity : BaseActivity() {
habitAdjustPositiveStreakView.setText((task.streak ?: 0).toString())
}
Task.TYPE_TODO -> taskSchedulingControls.dueDate = task.dueDate
+ Task.TYPE_REWARD -> rewardValueFormView.value = task.value
}
if (taskType == Task.TYPE_DAILY || taskType == Task.TYPE_TODO) {
task.checklist?.let { checklistContainer.checklistItems = it }
@@ -307,6 +315,8 @@ class TaskFormActivity : BaseActivity() {
if (habitAdjustPositiveStreakView.text.isNotEmpty()) thisTask.streak = habitAdjustPositiveStreakView.text.toString().toInt()
} else if (taskType == Task.TYPE_TODO) {
thisTask.dueDate = taskSchedulingControls.dueDate
+ } else if (taskType == Task.TYPE_REWARD) {
+ thisTask.value = rewardValueFormView.value
}
if (taskType == Task.TYPE_DAILY || taskType == Task.TYPE_TODO) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/RewardValueFormView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/RewardValueFormView.kt
new file mode 100644
index 000000000..7b62722d0
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/RewardValueFormView.kt
@@ -0,0 +1,61 @@
+package com.habitrpg.android.habitica.ui.views.tasks.form
+
+import android.content.Context
+import android.text.Editable
+import android.text.TextWatcher
+import android.util.AttributeSet
+import android.widget.EditText
+import android.widget.ImageButton
+import android.widget.RelativeLayout
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.extensions.asDrawable
+import com.habitrpg.android.habitica.extensions.inflate
+import com.habitrpg.android.habitica.ui.helpers.bindView
+import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
+import java.text.DecimalFormat
+
+class RewardValueFormView @JvmOverloads constructor(
+ context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : RelativeLayout(context, attrs, defStyleAttr), TextWatcher {
+
+ private val editText: EditText by bindView(R.id.edit_text)
+ private val upButton: ImageButton by bindView(R.id.up_button)
+ private val downButton: ImageButton by bindView(R.id.down_button)
+
+ private val decimalFormat = DecimalFormat("0.#")
+
+ var value = 0.0
+ set(value) {
+ field = if (value >= 0) value else 0.0
+ val stringValue = decimalFormat.format(field)
+ if (editText.text.toString() != stringValue) {
+ editText.setText(stringValue)
+ }
+ downButton.isEnabled = field > 0
+ }
+
+ init {
+ inflate(R.layout.task_form_reward_value, true)
+
+ editText.setCompoundDrawablesWithIntrinsicBounds(HabiticaIconsHelper.imageOfGold().asDrawable(context.resources), null, null, null)
+
+ upButton.setOnClickListener {
+ value += 1
+ }
+ downButton.setOnClickListener {
+ value -= 1
+ }
+
+ editText.addTextChangedListener(this)
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+ }
+
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+ }
+
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+ value = s.toString().toDoubleOrNull() ?: 0.0
+ }
+}
\ No newline at end of file