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 20319d9ad..fb777e4c9 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 @@ -70,6 +70,7 @@ open class ShopItem : RealmObject(), BaseObject { fun canAfford(user: User?, quantity: Int): Boolean = when (currency) { "gold" -> (value * quantity) <= (user?.stats?.gp ?: 0.0) + "gems" -> (value * quantity) <= (user?.gemCount ?: 0) else -> true } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt index 74100ddfb..7f960a980 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt @@ -72,6 +72,7 @@ import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.views.CurrencyText import com.habitrpg.android.habitica.ui.views.PixelArtView import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog +import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientGemsDialog import com.habitrpg.common.habitica.extensions.DataBindingUtils import kotlinx.coroutines.MainScope import kotlinx.coroutines.delay @@ -127,6 +128,11 @@ class BirthdayActivity : BaseActivity() { lifecycleScope.launchCatching({ isPurchasing.value = false }) { + if ((userViewModel.user.value?.gemCount ?: 0) < 60) { + val dialog = InsufficientGemsDialog(this@BirthdayActivity, 3) + dialog.show() + return@launchCatching + } isPurchasing.value = true val dialog = HabiticaAlertDialog(this@BirthdayActivity) dialog.setTitle( diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index f201ea4fc..a71941d55 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -10,7 +10,6 @@ import android.content.res.Configuration import android.os.Build import android.os.Bundle import android.view.KeyEvent -import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup @@ -18,7 +17,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.appcompat.app.ActionBarDrawerToggle -import androidx.appcompat.content.res.AppCompatResources import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState @@ -124,6 +122,21 @@ open class MainActivity : BaseActivity(), SnackbarActivity { private var sideAvatarView: AvatarView? = null private var drawerFragment: NavigationDrawerFragment? = null var drawerToggle: ActionBarDrawerToggle? = null + var showBirthdayIcon = false + var showBackButton: Boolean? = null + set(value) { + if (field == value) return + if (value == true && showBirthdayIcon) { + drawerToggle?.isDrawerIndicatorEnabled = false + drawerToggle?.setHomeAsUpIndicator(R.drawable.arrow_back) + } else if (value == false && showBirthdayIcon) { + drawerToggle?.isDrawerIndicatorEnabled = false + drawerToggle?.setHomeAsUpIndicator(R.drawable.icon_birthday) + } else { + drawerToggle?.isDrawerIndicatorEnabled = value != true + } + field = value + } private var resumeFromActivity = false private var userQuestStatus = UserQuestStatus.NO_QUEST private var lastNotificationOpen: Long? = null @@ -335,7 +348,7 @@ open class MainActivity : BaseActivity(), SnackbarActivity { return if (binding.root.parent is DrawerLayout && drawerToggle?.onOptionsItemSelected(item) == true) { true } else if (item.itemId == android.R.id.home) { - if (drawerToggle?.isDrawerIndicatorEnabled == true) { + if (showBackButton != true) { drawerFragment?.toggleDrawer() } else { MainNavigationController.navigateBack() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt index 1cee28fe0..26a345932 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt @@ -110,18 +110,18 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler var lastSet = CustomizationSet() val today = Date() for (customization in newCustomizationList) { + val isUsable = customization.isUsable(ownedCustomizations.contains(customization.id)) if (customization.availableFrom != null || customization.availableUntil != null) { if (((customization.availableFrom?.compareTo(today) ?: 0) > 0 || (customization.availableUntil?.compareTo(today) - ?: 0) < 0) && !customization.isUsable( - ownedCustomizations.contains( - customization.id - ) - ) + ?: 0) < 0) && !isUsable ) { continue } } + if ((customization.identifier?.contains("HabitversaryBash") == true || customization.identifier?.contains("birthday") == true) && !isUsable) { + continue + } if (customization.customizationSet != null && customization.customizationSet != lastSet.identifier) { if (lastSet.hasPurchasable && lastSet.price > 0) { customizationList.add(lastSet) @@ -136,7 +136,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler } customizationList.add(customization) lastSet.customizations.add(customization) - if (customization.isUsable(ownedCustomizations.contains(customization.id)) && lastSet.hasPurchasable) { + if (isUsable && lastSet.hasPurchasable) { lastSet.ownedCustomizations.add(customization) if (!lastSet.isSetDeal()) { lastSet.hasPurchasable = false diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt index 9ee6475fb..c4807477b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt @@ -81,7 +81,7 @@ abstract class BaseMainFragment : BaseFragment() { override fun onResume() { super.onResume() - activity?.drawerToggle?.isDrawerIndicatorEnabled = !showsBackButton + activity?.showBackButton = showsBackButton activity?.supportActionBar?.setDisplayHomeAsUpEnabled(true) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index a0ecd55cf..4c95054d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -178,9 +178,11 @@ class NavigationDrawerFragment : DialogFragment() { newItems.addAll(adapter.items) newItems.add(0, birthdayItem) adapter.updateItems(newItems) + (activity as? MainActivity)?.showBirthdayIcon = true } else if (event == null && item != null) { item.isVisible = false adapter.updateItem(item) + (activity as? MainActivity)?.showBirthdayIcon = true } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt index 958e92401..b3269f2f8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt @@ -47,7 +47,8 @@ abstract class TaskListFactory internal constructor( return } CoroutineScope(Dispatchers.Main + job).launch(ExceptionHandler.coroutine()) { - val tasks = taskRepository.getTasks(taskType, null, emptyArray()).firstOrNull()?.filter { task -> + val mirroredTasks = userRepository.getUser().firstOrNull()?.preferences?.tasks?.mirrorGroupTasks?.toTypedArray() + val tasks = taskRepository.getTasks(taskType, null, mirroredTasks ?: emptyArray()).firstOrNull()?.filter { task -> task.type == TaskType.TODO && !task.completed || task.isDisplayedActive } ?: return@launch taskList = taskRepository.getTaskCopies(tasks)