diff --git a/Habitica/res/values-night/colors.xml b/Habitica/res/values-night/colors.xml
index b5db0e555..8b3ad7f16 100644
--- a/Habitica/res/values-night/colors.xml
+++ b/Habitica/res/values-night/colors.xml
@@ -62,5 +62,6 @@
@color/green_500
@color/gray_400
@color/gray_10
+ @color/red_100
diff --git a/Habitica/res/values/colors.xml b/Habitica/res/values/colors.xml
index 9ce855bde..6c9806637 100644
--- a/Habitica/res/values/colors.xml
+++ b/Habitica/res/values/colors.xml
@@ -129,4 +129,5 @@
@color/green_10
@color/gray_200
@color/gray_700
+ @color/maroon_100
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 89d4d3b52..24af9b3e8 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -632,6 +632,7 @@
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.
+ This item is only available to a specific class.\nYou can select a class after level 10.
You can only purchase gear for your current class
Welcome to the Inn! Pull up a chair to chat.
Check into Inn
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 bf3f061d6..ffc67f48c 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
@@ -1,9 +1,11 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.shops
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.runtime.mutableStateOf
@@ -21,6 +23,7 @@ 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.activities.ClassSelectionActivity
import com.habitrpg.android.habitica.ui.adapter.inventory.ShopRecyclerAdapter
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
@@ -28,6 +31,7 @@ import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.CurrencyText
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.getTranslatedClassName
+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.RecyclerViewState
@@ -65,6 +69,13 @@ open class ShopFragment : BaseMainFragment()
override var binding: FragmentRefreshRecyclerviewBinding? = null
+ private val classSelectionResult =
+ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
+ lifecycleScope.launch(ExceptionHandler.coroutine()) {
+ userRepository.retrieveUser(true, true)
+ }
+ }
+
override fun createBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentRefreshRecyclerviewBinding {
return FragmentRefreshRecyclerviewBinding.inflate(inflater, container, false)
}
@@ -215,17 +226,33 @@ open class ShopFragment : BaseMainFragment()
}
private fun showClassChangeDialog(classIdentifier: String) {
- context?.let { context ->
- val alert = HabiticaAlertDialog(context)
- alert.setTitle(getString(R.string.class_confirmation_price, getTranslatedClassName(requireContext().resources, classIdentifier), 3))
- alert.addButton(R.string.choose_class, true) { _, _ ->
- lifecycleScope.launch(ExceptionHandler.coroutine()) {
- userRepository.changeClass(classIdentifier)
- loadMarketGear()
+ lifecycleScope.launch(ExceptionHandler.coroutine()) {
+ val user = userViewModel.user.value ?: return@launch
+ val bundle = Bundle()
+ bundle.putBoolean("isInitialSelection", user.flags?.classSelected == false)
+ val intent = Intent(activity, ClassSelectionActivity::class.java)
+ intent.putExtras(bundle)
+ if (user.flags?.classSelected == true && user.preferences?.disableClasses == false) {
+ if ((user.gemCount ?: 0) >= 3) {
+ context?.let { context ->
+ val dialog = HabiticaAlertDialog(context)
+ dialog.setTitle(R.string.change_class_confirmation)
+ dialog.addButton(R.string.change_class, true, true) { _, _ ->
+ classSelectionResult.launch(
+ intent
+ )
+ }
+ dialog.addButton(R.string.dialog_go_back, false)
+ dialog.enqueue()
+ }
+ } else {
+ val dialog = context?.let { InsufficientGemsDialog(it, 3) }
+ dialog?.show()
}
+ } else {
+ classSelectionResult.launch(intent)
}
- alert.addButton(R.string.dialog_go_back, false)
- alert.show()
+ loadMarketGear()
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/TodoViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/TodoViewHolder.kt
index c948f2173..cd92725ab 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/TodoViewHolder.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/TodoViewHolder.kt
@@ -40,9 +40,10 @@ class TodoViewHolder(
specialTaskTextView?.text = context.getString(R.string.today)
} else if (task.isDayOrMorePastDue() == true) {
task.dueDate?.let { specialTaskTextView?.text = dateFormatter.format(it) }
- specialTaskTextView?.setTextColor(ContextCompat.getColor(context, R.color.maroon_100))
+ specialTaskTextView?.setTextColor(ContextCompat.getColor(context, R.color.maroon100_red100))
} else {
task.dueDate?.let { specialTaskTextView?.text = dateFormatter.format(it) }
+ specialTaskTextView?.setTextColor(ContextCompat.getColor(context, R.color.gray_300))
}
this.specialTaskTextView?.visibility = View.VISIBLE
calendarIconView?.visibility = View.VISIBLE
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 920862c54..408c00f17 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
@@ -173,8 +173,13 @@ class PurchaseDialog(context: Context, private val userRepository : UserReposito
private fun setLimitedTextView() {
if (user == null) return
+ val userLvl = user?.stats?.lvl ?: 0
if (shopItem.habitClass != null && shopItem.habitClass != "special" && shopItem.habitClass != "armoire" && user?.stats?.habitClass != shopItem.habitClass) {
- limitedTextView.text = context.getString(R.string.class_equipment_shop_dialog)
+ limitedTextView.text = if (userLvl >= 10) {
+ context.getString(R.string.class_equipment_shop_dialog)
+ } else {
+ context.getString(R.string.insufficient_level_equipment_dialog)
+ }
limitedTextView.visibility = View.VISIBLE
limitedTextView.setBackgroundColor(ContextCompat.getColor(context, R.color.inverted_background))
} else if (shopItem.event?.end != null) {