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 {