diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 37c5fefdb..3c869fc69 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/Habitica/res/layout/dialog_purchase_shopitem.xml b/Habitica/res/layout/dialog_purchase_shopitem.xml index 401afbc67..474002978 100644 --- a/Habitica/res/layout/dialog_purchase_shopitem.xml +++ b/Habitica/res/layout/dialog_purchase_shopitem.xml @@ -35,7 +35,7 @@ android:gravity="center" style="@style/Body1" android:textSize="12sp" - android:padding="4dp" + android:padding="7dp" android:background="@color/brand_300" android:textColor="@color/white" tools:text="Available until May 6"/> diff --git a/Habitica/res/layout/shop_section_header.xml b/Habitica/res/layout/shop_section_header.xml index 6678ea373..a44d64454 100644 --- a/Habitica/res/layout/shop_section_header.xml +++ b/Habitica/res/layout/shop_section_header.xml @@ -33,4 +33,15 @@ tools:visibility="visible" /> + \ No newline at end of file diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index ae812cb04..39390d0ac 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -715,4 +715,6 @@ Class Equipment You already have all equipment! More will be released during the Grand Galas, near the solstices and equinoxes. Classless + This item is only available to a specific class.\nYou can change your class from Settings. + You can only purchase gear for your current class diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShopItemPurchasedEvent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/events/GearPurchasedEvent.kt similarity index 68% rename from Habitica/src/main/java/com/habitrpg/android/habitica/events/ShopItemPurchasedEvent.kt rename to Habitica/src/main/java/com/habitrpg/android/habitica/events/GearPurchasedEvent.kt index fd6462a03..32b4ef53c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/events/ShopItemPurchasedEvent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/GearPurchasedEvent.kt @@ -2,4 +2,4 @@ package com.habitrpg.android.habitica.events import com.habitrpg.android.habitica.models.shops.ShopItem -class ShopItemPurchasedEvent(val item: ShopItem) \ No newline at end of file +class GearPurchasedEvent(val item: ShopItem) \ No newline at end of file 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 66dad0c1f..1b440544c 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 @@ -39,6 +39,8 @@ open class ShopItem : RealmObject() { var path: String? = null var isSuggested: String? = null var pinType: String? = null + @SerializedName("klass") + var habitClass: String? = null val isTypeItem: Boolean get() = "eggs" == purchaseType || "hatchingPotions" == purchaseType || "food" == purchaseType || "armoire" == purchaseType || "potion" == purchaseType diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt index 402ffb20d..ba4f37ff7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt @@ -135,6 +135,12 @@ class ShopRecyclerAdapter : RecyclerView.Adapter() { selectedGearCategory = gearCategories[holder.selectedItem].identifier } } + if (user?.stats?.habitClass != category.identifier) { + holder.notesView?.text = context?.getString(R.string.class_gear_disclaimer) + holder.notesView?.visibility = View.VISIBLE + } else { + holder.notesView?.visibility = View.GONE + } } } ShopItem::class.java -> { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt index 3888e8f94..0802eeefd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt @@ -9,7 +9,7 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.AppComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.UserRepository -import com.habitrpg.android.habitica.events.ShopItemPurchasedEvent +import com.habitrpg.android.habitica.events.GearPurchasedEvent import com.habitrpg.android.habitica.helpers.RemoteConfigManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.shops.Shop @@ -39,6 +39,8 @@ class ShopFragment : BaseFragment() { private var layoutManager: GridLayoutManager? = null + private var gearCategories: MutableList? = null + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater.inflate(R.layout.fragment_recyclerview, container, false) @@ -80,11 +82,22 @@ class ShopFragment : BaseFragment() { this.shopIdentifier = savedInstanceState.getString(SHOP_IDENTIFIER_KEY, "") } + adapter?.selectedGearCategory = user?.stats?.habitClass ?: "" + if (shop == null) { loadShopInventory() } else { adapter?.setShop(shop, configManager.shopSpriteSuffix()) } + val categories = gearCategories + if (categories != null) { + adapter?.gearCategories = categories + } else { + if (Shop.MARKET == shopIdentifier) { + loadMarketGear() + } + } + adapter?.user = user view.post { setGridSpanCount(view.width) } @@ -115,9 +128,6 @@ class ShopFragment : BaseFragment() { } .subscribe(Action1 { this.shop = it - if (Shop.MARKET == shopIdentifier) { - loadMarketGear() - } this.adapter?.setShop(it, configManager.shopSpriteSuffix()) }, RxErrorHandler.handleEmptyError()) @@ -143,7 +153,7 @@ class ShopFragment : BaseFragment() { shop }) .subscribe(Action1 { - adapter?.selectedGearCategory = user?.stats?.habitClass ?: "" + this.gearCategories = it.categories adapter?.gearCategories = it.categories }, RxErrorHandler.handleEmptyError()) } @@ -177,7 +187,7 @@ class ShopFragment : BaseFragment() { } @Subscribe - fun onItemPurchased(event: ShopItemPurchasedEvent) { + fun onItemPurchased(event: GearPurchasedEvent) { loadShopInventory() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/SectionViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/SectionViewHolder.kt index 7fb7ad314..3a42813f6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/SectionViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/SectionViewHolder.kt @@ -16,7 +16,7 @@ class SectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val label: TextView by bindView(itemView, R.id.label) private val purchaseSetButton: Button? by bindView(itemView, R.id.purchaseSetButton) private val selectionSpinner: Spinner? by bindView(itemView, R.id.classSelectionSpinner) - + internal val notesView: TextView? by bindView(itemView, R.id.headerNotesView) var context: Context = itemView.context var spinnerSelectionChanged: (() -> Unit)? = null @@ -31,7 +31,7 @@ class SectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { spinnerSelectionChanged?.invoke() } - }; + } } 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 5b962f684..c55cc0e61 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 @@ -15,6 +15,7 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.AppComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.UserRepository +import com.habitrpg.android.habitica.events.GearPurchasedEvent import com.habitrpg.android.habitica.events.ShowSnackbarEvent import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand import com.habitrpg.android.habitica.helpers.RemoteConfigManager @@ -96,6 +97,7 @@ class PurchaseDialog(context: Context, component: AppComponent, val item: ShopIt shopItem.isTypeGear -> { contentView = PurchaseDialogGearContent(context) inventoryRepository.getEquipment(shopItem.key).first().subscribe(Action1 { contentView.setEquipment(it) }, RxErrorHandler.handleEmptyError()) + checkGearClass() } "gems" == shopItem.purchaseType -> contentView = PurchaseDialogGemsContent(context) else -> contentView = PurchaseDialogBaseContent(context) @@ -106,6 +108,18 @@ class PurchaseDialog(context: Context, component: AppComponent, val item: ShopIt setScrollviewSize() } + private fun checkGearClass() { + val user = user ?: return + + if (user.stats.habitClass != shopItem.habitClass) { + limitedTextView.text = context.getString(R.string.class_equipment_shop_dialog) + limitedTextView.visibility = View.VISIBLE + limitedTextView.setBackgroundColor(ContextCompat.getColor(context, R.color.gray_100)) + } else { + limitedTextView.visibility = View.GONE + } + } + private val compositeSubscription: CompositeSubscription = CompositeSubscription() var shopIdentifier: String? = null private var user: User? = null @@ -157,6 +171,8 @@ class PurchaseDialog(context: Context, component: AppComponent, val item: ShopIt if (!shopItem.canAfford(user)) { priceLabel.cantAfford = true } + + checkGearClass() } override fun dismiss() { @@ -239,6 +255,10 @@ class PurchaseDialog(context: Context, component: AppComponent, val item: ShopIt EventBus.getDefault().post(OpenGemPurchaseFragmentCommand()) } } + + if (item.isTypeGear) { + EventBus.getDefault().post(GearPurchasedEvent(item)) + } } } else { when {