From 8ab3f22ba23f5d44558cca0f51876326d5764553 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 30 May 2024 15:43:17 +0200 Subject: [PATCH] Improve empty states --- Habitica/res/layout/shop_section_empty.xml | 2 +- Habitica/res/values-de/strings.xml | 2 +- Habitica/res/values/strings.xml | 2 ++ .../models/shops/EmptyShopCategory.kt | 23 +++++++++++-- .../adapter/inventory/ShopRecyclerAdapter.kt | 9 +++-- .../fragments/inventory/shops/ShopFragment.kt | 34 +++++++++++++++++-- .../ui/viewHolders/EmptySectionViewHolder.kt | 8 +++++ 7 files changed, 71 insertions(+), 9 deletions(-) diff --git a/Habitica/res/layout/shop_section_empty.xml b/Habitica/res/layout/shop_section_empty.xml index efbd66572..0fac964c0 100644 --- a/Habitica/res/layout/shop_section_empty.xml +++ b/Habitica/res/layout/shop_section_empty.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> Erledigen Ablehnen Akzeptieren - Neue Ausrüstung automatisch anziehen + Neues automatisch anziehen Herausforderung verlassen Herausforderungen behalten Du hast einen Freund oder Freunde eingeladen, die Dich auf Deinem Abenteuer begleiten! diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 789459892..9cb206998 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -1527,6 +1527,8 @@ Warriors Mages Customization Shop + Equipment + customizing your avatar You diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/EmptyShopCategory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/EmptyShopCategory.kt index 1209909db..61cf28b07 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/EmptyShopCategory.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/EmptyShopCategory.kt @@ -1,11 +1,15 @@ package com.habitrpg.android.habitica.models.shops import android.content.Context +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ForegroundColorSpan +import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R -class EmptyShopCategory(categoryIdentifier: String, context: Context?) { +class EmptyShopCategory(val categoryIdentifier: String, context: Context?) { val title: String = context?.getString(R.string.you_own_all_items) ?: "" - val description: String + val description: Spannable init { val stringId = when (categoryIdentifier) { "backgrounds" -> R.string.try_on_next_month @@ -14,6 +18,19 @@ class EmptyShopCategory(categoryIdentifier: String, context: Context?) { "mystery_sets" -> R.string.try_on_equipment else -> R.string.try_on_customize } - description = context?.getString(stringId) ?: "" + if (context != null) { + val descriptionString = context.getString(stringId) + val words = listOf(context.getString(R.string.equipment), context.getString(R.string.customizing_your_avatar)) + val spannable = SpannableString(descriptionString) + for (word in words) { + val index = spannable.indexOf(word) + if (index >= 0) { + spannable.setSpan(ForegroundColorSpan(ContextCompat.getColor(context, R.color.brand_400)), index, index + word.length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) + } + } + description = spannable + } else { + description = SpannableString("") + } } } 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 fd45952ee..fc0789d4d 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 @@ -42,6 +42,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter Unit)? = null + var emptySectionClickedEvents: ((String) -> Unit)? = null var shopSpriteSuffix: String? = null set(value) { @@ -93,7 +94,6 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter (holder as? EmptyShopSectionViewHolder)?.bind(obj) + is EmptyShopCategory -> { + (holder as? EmptyShopSectionViewHolder)?.bind(obj) + (holder as? EmptyShopSectionViewHolder)?.onClicked = { + emptySectionClickedEvents?.invoke(obj.categoryIdentifier) + } + } is String -> (holder as? EmptyStateViewHolder)?.text = obj is Pair<*, *> -> 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 ef61d48e9..b65c58a77 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,6 +9,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.unit.dp +import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import com.habitrpg.android.habitica.R @@ -23,7 +24,6 @@ import com.habitrpg.android.habitica.helpers.HitType import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.ShopCategory import com.habitrpg.android.habitica.models.shops.ShopItem -import com.habitrpg.android.habitica.models.social.Group import com.habitrpg.android.habitica.ui.adapter.inventory.ShopRecyclerAdapter import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.fragments.purchases.EventOutcomeSubscriptionBottomSheetFragment @@ -36,10 +36,10 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaProgressDialog import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientGemsDialog import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog import com.habitrpg.common.habitica.helpers.ExceptionHandler +import com.habitrpg.common.habitica.helpers.MainNavigationController import com.habitrpg.common.habitica.helpers.RecyclerViewState import com.habitrpg.common.habitica.helpers.launchCatching import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch @@ -160,6 +160,34 @@ open class ShopFragment : BaseMainFragment() adapter?.changeClassEvents = { showClassChangeDialog(it) } + adapter?.emptySectionClickedEvents = { + if (shopIdentifier == Shop.CUSTOMIZATIONS) { + var navigationID = R.id.ComposeAvatarCustomizationFragment + var type = "" + var category: String? = null + if (it == "color") { + type = "hair" + category = "color" + } else if (it == "facialHair") { + type = "hair" + category = "beard" + } else if (it == "base") { + type = "hair" + category = "base" + } else if (it == "animalEars") { + navigationID = R.id.composeAvatarEquipmentFragment + category = "headAccessory" + } else if (it == "animalTails") { + navigationID = R.id.composeAvatarEquipmentFragment + category = "back" + } else if (it == "backgrounds") { + category = "background" + } + MainNavigationController.navigate(navigationID, bundleOf("category" to category, "type" to type)) + } else if (shopIdentifier == Shop.TIME_TRAVELERS_SHOP) { + MainNavigationController.navigate(R.id.equipmentOverviewFragment) + } + } lifecycleScope.launchCatching { inventoryRepository.getInAppReward("armoire").collect { @@ -337,9 +365,11 @@ open class ShopFragment : BaseMainFragment() specialCategory.items.add(ShopItem.makeFortifyItem(context?.resources)) newShop.categories.add(specialCategory) } + Shop.TIME_TRAVELERS_SHOP -> { formatTimeTravelersShop(newShop) } + Shop.SEASONAL_SHOP -> { newShop.categories.sortWith( compareBy { it.items.firstOrNull()?.currency != "gold" } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/EmptySectionViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/EmptySectionViewHolder.kt index 9dd9f5318..16999a9ec 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/EmptySectionViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/EmptySectionViewHolder.kt @@ -8,6 +8,14 @@ import com.habitrpg.android.habitica.models.shops.EmptyShopCategory class EmptyShopSectionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val binding = ShopSectionEmptyBinding.bind(itemView) + var onClicked: (() -> Unit)? = null + + init { + binding.root.setOnClickListener { + onClicked?.invoke() + } + } + fun bind(emptyShopCategory: EmptyShopCategory) { binding.titleView.text = emptyShopCategory.title binding.descriptionView.text = emptyShopCategory.description