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