From 42b3797ebbb7dccef1995ce4780623eff14ee885 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 26 Apr 2019 10:28:13 +0200 Subject: [PATCH] Fix task form issues --- Habitica/AndroidManifest.xml | 3 +- Habitica/build.gradle | 2 +- Habitica/res/menu/menu_task_create.xml | 2 +- Habitica/res/menu/menu_task_edit.xml | 2 +- .../ui/activities/TaskFormActivity.kt | 44 ++++++++++++------- .../habitica/ui/views/shops/PurchaseDialog.kt | 2 +- .../views/tasks/form/RewardValueFormView.kt | 34 +++++++++++--- 7 files changed, 62 insertions(+), 27 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index e40c70062..8b3f2d9ce 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -108,7 +108,8 @@ + tools:ignore="UnusedAttribute" + android:windowSoftInputMode="stateVisible|adjustResize"> diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 253e49fec..2927958d8 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -153,7 +153,7 @@ android { buildConfigField "String", "TESTING_LEVEL", "\"production\"" multiDexEnabled true - versionCode 2101 + versionCode 2103 versionName "1.9" } diff --git a/Habitica/res/menu/menu_task_create.xml b/Habitica/res/menu/menu_task_create.xml index c627b2385..1fc311170 100644 --- a/Habitica/res/menu/menu_task_create.xml +++ b/Habitica/res/menu/menu_task_create.xml @@ -1,6 +1,6 @@ - diff --git a/Habitica/res/menu/menu_task_edit.xml b/Habitica/res/menu/menu_task_edit.xml index a3f4a1a10..ef7782aed 100644 --- a/Habitica/res/menu/menu_task_edit.xml +++ b/Habitica/res/menu/menu_task_edit.xml @@ -3,6 +3,6 @@ xmlns:tools="http://schemas.android.com/tools"> - 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 f282650c9..c009b383e 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 @@ -3,43 +3,42 @@ package com.habitrpg.android.habitica.ui.activities import android.app.Activity import android.content.Context import android.content.Intent +import android.content.res.ColorStateList +import android.graphics.drawable.ColorDrawable import android.os.Bundle +import android.os.Handler import android.view.Menu +import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager import android.widget.CheckBox import android.widget.EditText import android.widget.LinearLayout import android.widget.TextView +import androidx.appcompat.widget.AppCompatCheckBox import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat +import androidx.core.view.children +import androidx.core.view.forEachIndexed import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.AppComponent import com.habitrpg.android.habitica.data.TagRepository import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository -import com.habitrpg.android.habitica.extensions.notNull +import com.habitrpg.android.habitica.extensions.OnChangeTextWatcher +import com.habitrpg.android.habitica.extensions.dpToPx import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.Tag import com.habitrpg.android.habitica.models.tasks.HabitResetOption import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.ui.helpers.bindView -import io.reactivex.functions.Consumer -import javax.inject.Inject -import android.content.res.ColorStateList -import android.graphics.drawable.ColorDrawable -import android.os.Handler -import android.view.MenuItem -import android.view.inputmethod.InputMethodManager -import androidx.appcompat.widget.AppCompatCheckBox -import androidx.core.view.children -import androidx.core.view.forEach -import androidx.core.view.forEachIndexed -import com.habitrpg.android.habitica.extensions.dpToPx import com.habitrpg.android.habitica.ui.views.tasks.form.* +import io.reactivex.functions.Consumer import io.realm.RealmList import java.util.* +import javax.inject.Inject class TaskFormActivity : BaseActivity() { @@ -96,6 +95,8 @@ class TaskFormActivity : BaseActivity() { setSelectedAttribute(value) } + private var canSave: Boolean = false + private var tintColor: Int = 0 set(value) { field = value @@ -141,6 +142,10 @@ class TaskFormActivity : BaseActivity() { configureForm() }, RxErrorHandler.handleEmptyError())) + + textEditText.addTextChangedListener(OnChangeTextWatcher { _, _, _, _ -> + checkCanSave() + }) statStrengthButton.setOnClickListener { selectedStat = Stats.STRENGTH } statIntelligenceButton.setOnClickListener { selectedStat = Stats.INTELLIGENCE } statConstitutionButton.setOnClickListener { selectedStat = Stats.CONSTITUTION } @@ -167,18 +172,26 @@ class TaskFormActivity : BaseActivity() { } else { menuInflater.inflate(R.menu.menu_task_edit, menu) } + menu.findItem(R.id.action_save).isEnabled = canSave return true } override fun onOptionsItemSelected(item: MenuItem?): Boolean { when (item?.itemId) { - R.id.action_create -> saveTask() - R.id.action_save_changes -> saveTask() + R.id.action_save -> saveTask() R.id.action_delete -> deleteTask() } return super.onOptionsItemSelected(item) } + private fun checkCanSave() { + val newCanSave = textEditText.text.isNotBlank() + if (newCanSave != canSave) { + invalidateOptionsMenu() + } + canSave = newCanSave + } + private fun configureForm() { val habitViewsVisibility = if (taskType == Task.TYPE_HABIT) View.VISIBLE else View.GONE habitScoringButtons.visibility = habitViewsVisibility @@ -246,6 +259,7 @@ class TaskFormActivity : BaseActivity() { } private fun fillForm(task: Task) { + canSave = true textEditText.setText(task.text) notesEditText.setText(task.notes) taskDifficultyButtons.selectedDifficulty = task.priority diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt index b1eadd05b..12a922140 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt @@ -220,7 +220,7 @@ class PurchaseDialog(context: Context, component: AppComponent?, val item: ShopI val observable: Flowable if (shopIdentifier != null && shopIdentifier == Shop.TIME_TRAVELERS_SHOP || "mystery_set" == shopItem.purchaseType) { observable = if (shopItem.purchaseType == "gear") { - inventoryRepository.purchaseMysterySet(shopItem.categoryIdentifier) + inventoryRepository.purchaseMysterySet(shopItem.key) } else { inventoryRepository.purchaseHourglassItem(shopItem.purchaseType, shopItem.key) } 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 index 2ab4781ab..15cbcdb18 100644 --- 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 @@ -21,21 +21,40 @@ class RewardValueFormView @JvmOverloads constructor( 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.#") + private val decimalFormat = DecimalFormat("0.###") + private var editTextIsFocused = false 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) + val newValue = if (value >= 0) value else 0.0 + val oldValue = field + field = newValue + if (oldValue != newValue) { + valueString = decimalFormat.format(newValue) } downButton.isEnabled = field > 0 } + var valueString = "" + set(value) { + field = value + + if (editText.text.toString() != field) { + editText.setText(field) + if (editTextIsFocused) { + editText.setSelection(field.length) + } + } + val newValue = field.toDoubleOrNull() ?: 0.0 + if (this.value != newValue) { + this.value = newValue + } + } + init { inflate(R.layout.task_form_reward_value, true) - + //set value here, so that the setter is called and everything is set up correctly + value = 10.0 editText.setCompoundDrawablesWithIntrinsicBounds(HabiticaIconsHelper.imageOfGold().asDrawable(context.resources), null, null, null) upButton.setOnClickListener { @@ -46,7 +65,8 @@ class RewardValueFormView @JvmOverloads constructor( } editText.addTextChangedListener(OnChangeTextWatcher { s, _, _, _ -> - value = s.toString().toDoubleOrNull() ?: 0.0 + valueString = s.toString() }) + editText.setOnFocusChangeListener { _, hasFocus -> editTextIsFocused = hasFocus } } } \ No newline at end of file