From b1c393b168b1070ede3da5444ee1337d7c689305 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 11 Jun 2020 17:07:46 +0200 Subject: [PATCH] Implement bulk purchasing items. Fixes #1288 --- .../layout/dialog_purchase_content_item.xml | 9 ++++++ Habitica/res/values/strings.xml | 1 - .../android/habitica/models/shops/ShopItem.kt | 7 +++-- .../habitica/ui/views/shops/PurchaseDialog.kt | 30 +++++++++++++------ .../views/shops/PurchaseDialogItemContent.kt | 5 ++++ 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/Habitica/res/layout/dialog_purchase_content_item.xml b/Habitica/res/layout/dialog_purchase_content_item.xml index c61f9b15c..568e5b470 100644 --- a/Habitica/res/layout/dialog_purchase_content_item.xml +++ b/Habitica/res/layout/dialog_purchase_content_item.xml @@ -1,6 +1,7 @@ + + Read More You are unable to buy that amount. Still have a question? - Delete Checklist entry %1$d/%2$d Task list display Onboarding Tasks diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItem.kt index a619c621b..4d96a3b6b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItem.kt @@ -68,10 +68,13 @@ open class ShopItem : RealmObject() { val isTypeAnimal: Boolean get() = "pets" == purchaseType || "mounts" == purchaseType + val canPurchaseBulk: Boolean + get() = "eggs" == purchaseType || "hatchingPotions" == purchaseType || "food" == purchaseType + fun canAfford(user: User?, quantity: Int): Boolean = when(currency) { "gold" -> (value * quantity) <= user?.stats?.gp ?: 0.0 - "gems" -> true - "hourglasses" -> true + "gems" -> (value * quantity) <= user?.gemCount?.toDouble() ?: 0.0 + "hourglasses" -> (value * quantity) <= user?.hourglassCount?.toDouble() ?: 0.0 else -> false } 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 6dff63929..5ee21ed3e 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 @@ -93,17 +93,29 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop val contentView: PurchaseDialogContent when { - shopItem.isTypeItem -> contentView = PurchaseDialogItemContent(context) - shopItem.isTypeQuest -> { - contentView = PurchaseDialogQuestContent(context) - inventoryRepository.getQuestContent(shopItem.key).firstElement().subscribe(Consumer { contentView.setQuestContent(it) }, RxErrorHandler.handleEmptyError()) + shopItem.isTypeItem -> { + val itemContent = PurchaseDialogItemContent(context) + if (shopItem.canPurchaseBulk) { + itemContent.stepperView.visibility = View.VISIBLE + itemContent.stepperView.onValueChanged = { + purchaseQuantity = it.toInt() + updatePurchaseTotal() + } + } else { + itemContent.stepperView.visibility = View.GONE + } + contentView = itemContent } - shopItem.isTypeGear -> { + shopItem.isTypeQuest -> { + contentView = PurchaseDialogQuestContent(context) + inventoryRepository.getQuestContent(shopItem.key).firstElement().subscribe(Consumer { contentView.setQuestContent(it) }, RxErrorHandler.handleEmptyError()) + } + shopItem.isTypeGear -> { contentView = PurchaseDialogGearContent(context) - inventoryRepository.getEquipment(shopItem.key).firstElement().subscribe(Consumer { contentView.setEquipment(it) }, RxErrorHandler.handleEmptyError()) + inventoryRepository.getEquipment(shopItem.key).firstElement().subscribe(Consumer { contentView.setEquipment(it) }, RxErrorHandler.handleEmptyError()) checkGearClass() } - "gems" == shopItem.purchaseType -> { + "gems" == shopItem.purchaseType -> { val gemContent = PurchaseDialogGemsContent(context) gemContent.stepperView.onValueChanged = { purchaseQuantity = it.toInt() @@ -111,7 +123,7 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop } contentView = gemContent } - else -> contentView = PurchaseDialogBaseContent(context) + else -> contentView = PurchaseDialogBaseContent(context) } amountErrorLabel = contentView.findViewById(R.id.amount_error_label) @@ -123,7 +135,7 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop private fun updatePurchaseTotal() { priceLabel.value = shopItem.value.toDouble() * purchaseQuantity - if (shopItem.canAfford(user, purchaseQuantity) && !shopItem.locked && purchaseQuantity >= 1) { + if ((shopItem.currency != "gold" || shopItem.canAfford(user, purchaseQuantity)) && !shopItem.locked && purchaseQuantity >= 1) { buyButton.background = context.getDrawable(R.drawable.button_background_primary) priceLabel.setTextColor(ContextCompat.getColor(context, R.color.white)) buyLabel.setTextColor(ContextCompat.getColor(context, R.color.white)) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt index 68d4e599b..8b53010c7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt @@ -4,12 +4,16 @@ import android.content.Context import android.util.AttributeSet import android.widget.TextView import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.extensions.asDrawable import com.habitrpg.android.habitica.ui.helpers.bindView import com.habitrpg.android.habitica.models.shops.ShopItem +import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import com.habitrpg.android.habitica.ui.views.tasks.form.StepperValueFormView class PurchaseDialogItemContent : PurchaseDialogContent { internal val notesTextView: TextView by bindView(R.id.notesTextView) + val stepperView: StepperValueFormView by bindView(R.id.stepper_view) override val viewId: Int get() = R.layout.dialog_purchase_content_item @@ -21,5 +25,6 @@ class PurchaseDialogItemContent : PurchaseDialogContent { override fun setItem(item: ShopItem) { super.setItem(item) notesTextView.text = item.notes + stepperView.iconDrawable = null } }