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