diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 921c4ee82..2e7239082 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -134,6 +134,7 @@
Buy
Dismiss
Party
+ %s\'s Party
Chat
Members
Habits
@@ -243,6 +244,8 @@
Equipped
Are you sure you want to cancel this Quest? Canceling the Quest will cancel all accepted and pending invitations. The Quest will be returned to the owner’s inventory.
Are you sure? Only %1$d of your %2$d party members have joined this quest! Quests start automatically when all players have joined or rejected the invitation.
+ You have to be in a Party before starting a Quest
+ Once in a Party, you can take on Quests by yourself or invite friends to Quest with them too!
1 month ago
%d months ago
1w ago
@@ -280,6 +283,7 @@
Hatch with potion
Hatch with egg
Invite party
+ Create new party
Feed %s with:
Use
Feed
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt
index 915b16fe6..d13f80c92 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ItemRecyclerAdapter.kt
@@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.adapter.inventory
import android.content.Context
import android.content.res.Resources
+import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
@@ -12,6 +13,7 @@ import com.habitrpg.android.habitica.extensions.layoutInflater
import com.habitrpg.android.habitica.models.inventory.*
import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.OwnedPet
+import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import com.habitrpg.android.habitica.ui.menu.BottomSheetMenu
@@ -23,7 +25,7 @@ import io.reactivex.rxjava3.subjects.PublishSubject
import java.text.SimpleDateFormat
import java.util.*
-class ItemRecyclerAdapter(val context: Context) : BaseRecyclerViewAdapter() {
+class ItemRecyclerAdapter(val context: Context, val user: User?) : BaseRecyclerViewAdapter() {
var isHatching: Boolean = false
var isFeeding: Boolean = false
@@ -44,9 +46,9 @@ class ItemRecyclerAdapter(val context: Context) : BaseRecyclerViewAdapter()
private val hatchPetSubject = PublishSubject.create>()
private val feedPetSubject = PublishSubject.create()
+ private val createNewPartySubject = PublishSubject.create()
private val useSpecialSubject = PublishSubject.create()
-
fun getSellItemFlowable(): Flowable {
return sellItemEvents.toFlowable(BackpressureStrategy.DROP)
}
@@ -61,6 +63,7 @@ class ItemRecyclerAdapter(val context: Context) : BaseRecyclerViewAdapter = startHatchingSubject.toFlowable(BackpressureStrategy.DROP)
val hatchPetEvents: Flowable> = hatchPetSubject.toFlowable(BackpressureStrategy.DROP)
val feedPetEvents: Flowable = feedPetSubject.toFlowable(BackpressureStrategy.DROP)
+ val startNewPartyEvents: Flowable = createNewPartySubject.toFlowable(BackpressureStrategy.DROP)
val useSpecialEvents: Flowable = useSpecialSubject.toFlowable(BackpressureStrategy.DROP)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
@@ -159,7 +162,11 @@ class ItemRecyclerAdapter(val context: Context) : BaseRecyclerViewAdapter 0) {
@@ -184,7 +191,12 @@ class ItemRecyclerAdapter(val context: Context) : BaseRecyclerViewAdapter
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt
index 27d2f0368..f208af7a5 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt
@@ -102,7 +102,7 @@ class ItemDialogFragment : BaseDialogFragment(), SwipeRefr
adapter = binding?.recyclerView?.adapter as? ItemRecyclerAdapter
if (adapter == null) {
context?.let {
- adapter = ItemRecyclerAdapter(context)
+ adapter = ItemRecyclerAdapter(context, user)
adapter?.isHatching = this.isHatching
adapter?.isFeeding = this.isFeeding
adapter?.fragment = this
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt
index 69ac2e8ee..b03141c18 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt
@@ -6,6 +6,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.core.os.bundleOf
import androidx.activity.result.contract.ActivityResultContracts
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.R
@@ -32,6 +33,7 @@ import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.EmptyItem
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
import com.habitrpg.android.habitica.ui.helpers.loadImage
+import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.dialogs.OpenedMysteryitemDialog
@@ -99,7 +101,7 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL
adapter = binding?.recyclerView?.adapter as? ItemRecyclerAdapter
if (adapter == null) {
context?.let {
- adapter = ItemRecyclerAdapter(context)
+ adapter = ItemRecyclerAdapter(context, user)
}
binding?.recyclerView?.adapter = adapter
adapter?.useSpecialEvents?.subscribeWithErrorHandler { onSpecialItemSelected(it) }?.let { compositeSubscription.add(it) }
@@ -144,6 +146,7 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL
)
compositeSubscription.add(adapter.startHatchingEvents.subscribeWithErrorHandler { showHatchingDialog(it) })
compositeSubscription.add(adapter.hatchPetEvents.subscribeWithErrorHandler { hatchPet(it.first, it.second) })
+ compositeSubscription.addAll(adapter.startNewPartyEvents.subscribeWithErrorHandler { createNewParty(it) })
}
}
activity?.let {
@@ -205,6 +208,47 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL
}
}
+ private fun createNewParty(isCreateNewParty: Boolean) {
+ val alert = context?.let { HabiticaAlertDialog(it) }
+ alert?.setTitle(R.string.quest_party_required_title)
+ alert?.setMessage(R.string.quest_party_required_description)
+ alert?.addButton(R.string.create_new_party, true, false) { _, _ ->
+ socialRepository.createGroup(
+ getString(R.string.usernames_party, user?.profile?.name),
+ "",
+ user?.id,
+ "party",
+ "",
+ false
+ )
+ .flatMap {
+ userRepository.retrieveUser(false, true)
+ .filter { it.hasParty }
+ .flatMap { socialRepository.retrieveGroup("party") }
+ .flatMap { group1 ->
+ socialRepository.retrieveGroupMembers(
+ group1.id,
+ true
+ )
+ }
+ }
+ .subscribe(
+ {
+ MainNavigationController.navigate(
+ R.id.partyFragment,
+ bundleOf(Pair("partyID", user?.party?.id))
+ )
+ },
+ RxErrorHandler.handleEmptyError()
+ )
+
+ }
+ alert?.addButton(R.string.close, false) { _, _ ->
+ alert.dismiss()
+ }
+ alert?.show()
+ }
+
private fun loadItems() {
val itemClass: Class = when (itemType) {
"eggs" -> Egg::class.java