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) {