diff --git a/Habitica/res/layout/row_shopitem.xml b/Habitica/res/layout/row_shopitem.xml index eec6f396a..158cb0a2b 100644 --- a/Habitica/res/layout/row_shopitem.xml +++ b/Habitica/res/layout/row_shopitem.xml @@ -42,11 +42,13 @@ android:id="@+id/unlockLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:gravity="center_horizontal" - android:layout_gravity="center_horizontal" + android:gravity="center" + android:layout_gravity="center" style="@style/Body1" android:textSize="11sp" android:textColor="@color/gray_300" + android:paddingStart="2dp" + android:paddingRight="2dp" /> diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 07a4501fe..c755488e9 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -337,6 +337,9 @@ Unlock by inviting friends Unlock by logging into Habitica regularly Unlock by creating an account + Invite Friends + login into Habitica regularly + create an account Purchased %1$s gold Message copied to Clipboard @@ -942,4 +945,7 @@ Kicked from group Guidance with setting up your Habitica Account Skill unlocks at level %d + Locked + Finish Quest %d + Level %d 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 620e7a549..999b8a208 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 @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.models.shops +import android.content.Context import android.content.res.Resources import com.google.gson.annotations.SerializedName @@ -12,6 +13,10 @@ import io.realm.annotations.PrimaryKey open class ShopItem : RealmObject() { @PrimaryKey var key: String = "" + set(value) { + field = value + unlockCondition?.questKey = key + } var text: String? = "" var notes: String? = "" @SerializedName("class") @@ -36,11 +41,20 @@ open class ShopItem : RealmObject() { var categoryIdentifier: String = "" var limitedNumberLeft: Int? = null var unlockCondition: ShopItemUnlockCondition? = null + set(value) { + field = value + if (key.isNotEmpty()) { + field?.questKey = key + } + } var path: String? = null var isSuggested: String? = null var pinType: String? = null @SerializedName("klass") var habitClass: String? = null + var previous: String? = null + @SerializedName("lvl") + var level: Int? = null val isTypeItem: Boolean get() = "eggs" == purchaseType || "hatchingPotions" == purchaseType || "food" == purchaseType || "armoire" == purchaseType || "potion" == purchaseType @@ -73,6 +87,26 @@ open class ShopItem : RealmObject() { return this.key.hashCode() } + fun lockedReason(context: Context): String? { + return when { + unlockCondition != null -> { + unlockCondition?.shortReadableUnlockConditionId()?.let { context.getString(it) } + } + previous != null -> { + try { + val thisNumber = Character.getNumericValue(key.last()) + context.getString(R.string.unlock_previous, thisNumber - 1) + } catch (e: NumberFormatException) { + null + } + } + level != null -> { + context.getString(R.string.unlock_level, level ?: 0) + } + else -> null + } + } + companion object { private const val GEM_FOR_GOLD = "gem" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItemUnlockCondition.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItemUnlockCondition.kt index d53172005..245f359e9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItemUnlockCondition.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/ShopItemUnlockCondition.kt @@ -8,7 +8,8 @@ import io.realm.annotations.PrimaryKey open class ShopItemUnlockCondition : RealmObject() { @PrimaryKey - internal var condition: String? = null + var questKey: String? = null + private var condition: String? = null fun readableUnlockConditionId(): Int = when (this.condition) { "party invite" -> R.string.party_invite @@ -16,4 +17,11 @@ open class ShopItemUnlockCondition : RealmObject() { "create account" -> R.string.create_account else -> R.string.empty } + + fun shortReadableUnlockConditionId(): Int = when (this.condition) { + "party invite" -> R.string.party_invite_short + "login incentive" -> R.string.login_incentive_short + "create account" -> R.string.create_account_short + else -> R.string.empty + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt index eae63f985..ec01980f0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt @@ -186,7 +186,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { val dialog = HabiticaAlertDialog(context) dialog.setTitle(R.string.delete_account) dialog.setMessage(deleteMessage) - dialog.addButton(R.string.delete_account_confirmation, true, true) { _, _ -> + dialog.addButton(R.string.delete_account_confirmation, isPrimary = true, isDestructive = true) { _, _ -> deleteAccount(editText?.text?.toString() ?: "") } dialog.addCancelButton() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt index 1424da989..d5b682d8a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt @@ -64,7 +64,11 @@ class ShopItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vi DataBindingUtils.loadImage(this.imageView, item.imageName) - if (item.unlockCondition == null || !item.locked) { + itemDetailIndicator.text = null + itemDetailIndicator.visibility = View.GONE + + val lockedReason = item.lockedReason(context) + if (!item.locked) { priceLabel.text = item.value.toString() priceLabel.currency = item.currency if (item.currency == null) { @@ -73,23 +77,19 @@ class ShopItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vi priceLabel.visibility = View.VISIBLE unlockLabel.visibility = View.GONE } else { - unlockLabel.setText(item.unlockCondition?.readableUnlockConditionId() ?: 0) + unlockLabel.text = lockedReason priceLabel.visibility = View.GONE unlockLabel.visibility = View.VISIBLE + itemDetailIndicator.background = lockedDrawable + itemDetailIndicator.visibility = View.VISIBLE } - itemDetailIndicator.text = null - itemDetailIndicator.visibility = View.GONE if (item.isLimited) { itemDetailIndicator.background = limitedDrawable itemDetailIndicator.visibility = View.VISIBLE } priceLabel.isLocked = item.locked || !canBuy - if (item.locked) { - itemDetailIndicator.background = lockedDrawable - itemDetailIndicator.visibility = View.VISIBLE - } } override fun onClick(view: View) { 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 e80e0b4c0..ce53fadaa 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 @@ -65,14 +65,6 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop set(value) { field = value - if (shopItem.unlockCondition == null) { - priceLabel.value = shopItem.value.toDouble() - priceLabel.currency = shopItem.currency - } else { - setBuyButtonEnabled(false) - buyLabel.text = shopItem.unlockCondition?.readableUnlockConditionId()?.let { context.getString(it) } - } - if (shopItem.isLimited) { //TODO: replace with correct date once API is final limitedTextView.text = context.getString(R.string.available_until, Date().toString()) @@ -80,7 +72,19 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop limitedTextView.visibility = View.GONE } - priceLabel.isLocked = shopItem.locked + if (shopItem.lockedReason(context) == null) { + priceLabel.value = shopItem.value.toDouble() + priceLabel.currency = shopItem.currency + } else { + limitedTextView.text = shopItem.lockedReason(context) + } + if (shopItem.locked) { + setBuyButtonEnabled(false) + buyLabel.text = context.getString(R.string.locked) + limitedTextView.visibility = View.VISIBLE + } + + priceLabel.isLocked = shopItem.locked || shopItem.lockedReason(context) != null val contentView: PurchaseDialogContent when {