diff --git a/Habitica/res/layout/dialog_completed_quest_content.xml b/Habitica/res/layout/dialog_completed_quest_content.xml new file mode 100644 index 000000000..3c2cd58f2 --- /dev/null +++ b/Habitica/res/layout/dialog_completed_quest_content.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.kt index f4d683f64..7b23534ef 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Quest.kt @@ -28,6 +28,8 @@ open class Quest : RealmObject() { var participants: RealmList? = null var rageStrikes: RealmList? = null + var completed: String? = null + fun hasRageStrikes(): Boolean { return rageStrikes?.isNotEmpty() ?: false } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt index 9f46f58d5..a5d84d7a6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/QuestContent.kt @@ -16,6 +16,7 @@ open class QuestContent : RealmObject(), Item { } internal var text: String = "" var notes: String = "" + var completion: String = "" internal var value: Int = 0 var previous: String? = null var lvl: Int = 0 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 91ca338cb..f80f95148 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 @@ -63,6 +63,7 @@ import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayTy import com.habitrpg.android.habitica.ui.views.ValueBar import com.habitrpg.android.habitica.ui.views.dialogs.AchievementDialog import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog +import com.habitrpg.android.habitica.ui.views.dialogs.QuestCompletedDialog import com.habitrpg.android.habitica.ui.views.yesterdailies.YesterdailyDialog import com.habitrpg.android.habitica.userpicture.BitmapUtils import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider @@ -350,6 +351,13 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { val intent = Intent(this, VerifyUsernameActivity::class.java) startActivity(intent) } + + val quest = user?.party?.quest + if (quest?.completed?.isNotBlank() == true) { + compositeSubscription.add(inventoryRepository.getQuestContent(user?.party?.quest?.completed ?: "").firstElement().subscribe { + QuestCompletedDialog.showWithQuest(this, it) + }) + } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialog.kt new file mode 100644 index 000000000..0352531ff --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialog.kt @@ -0,0 +1,37 @@ +package com.habitrpg.android.habitica.ui.views.dialogs + +import android.content.Context +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.models.inventory.QuestContent + +class QuestCompletedDialog(context: Context) : HabiticaAlertDialog(context) { + + var quest: QuestContent? = null + set(value) { + field = value + if (value == null) return + + val contentView = QuestCompletedDialogContent(context) + contentView.setQuestContent(value) + setAdditionalContentView(contentView) + } + + override fun dismiss() { + dialog = null + super.dismiss() + } + + companion object { + private var dialog: QuestCompletedDialog? = null + + fun showWithQuest(context: Context, quest: QuestContent) { + if (dialog != null) return + + dialog = QuestCompletedDialog(context) + dialog?.quest = quest + dialog?.setTitle(R.string.quest_completed) + dialog?.addButton(R.string.onwards, isPrimary = true, isDestructive = false) + dialog?.enqueue() + } + } +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt new file mode 100644 index 000000000..137586a8c --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt @@ -0,0 +1,99 @@ +package com.habitrpg.android.habitica.ui.views.dialogs + +import android.content.Context +import android.util.AttributeSet +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import com.facebook.drawee.view.SimpleDraweeView +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.DialogCompletedQuestContentBinding +import com.habitrpg.android.habitica.extensions.layoutInflater +import com.habitrpg.android.habitica.models.inventory.QuestContent +import com.habitrpg.android.habitica.models.inventory.QuestDropItem +import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper + +class QuestCompletedDialogContent : LinearLayout { + + + private lateinit var binding: DialogCompletedQuestContentBinding + + constructor(context: Context) : super(context) { + setupView() + } + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + setupView() + } + + private fun setupView() { + orientation = VERTICAL + gravity = Gravity.CENTER + + binding = DialogCompletedQuestContentBinding.inflate(context.layoutInflater, this) + } + + fun setQuestContent(questContent: QuestContent) { + binding.titleTextView.text = questContent.text + binding.notesTextView.text = questContent.completion + DataBindingUtils.loadImage(binding.imageView, "quest_" + questContent.key) + + val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater + + if (questContent.drop != null && questContent.drop?.items != null) { + questContent.drop?.items + ?.filterNot { it.isOnlyOwner } + ?.forEach { addRewardsRow(inflater, it, binding.rewardsList) } + + var hasOwnerRewards = false + for (item in questContent.drop?.items ?: emptyList()) { + if (item.isOnlyOwner) { + addRewardsRow(inflater, item, binding.ownerRewardsList) + hasOwnerRewards = true + } + } + if (!hasOwnerRewards) { + binding.ownerRewardsTitle.visibility = View.GONE + binding.ownerRewardsList.visibility = View.GONE + } + + if (questContent.drop?.exp ?: 0 > 0) { + val view = inflater?.inflate(R.layout.row_quest_reward_imageview, binding.rewardsList, false) as? ViewGroup + val imageView = view?.findViewById(R.id.imageView) + imageView?.scaleType = ImageView.ScaleType.CENTER + imageView?.setImageBitmap(HabiticaIconsHelper.imageOfExperienceReward()) + val titleTextView = view?.findViewById(R.id.titleTextView) + titleTextView?.text = context.getString(R.string.experience_reward, questContent.drop?.exp) + binding.rewardsList.addView(view) + } + + if (questContent.drop?.gp ?: 0 > 0) { + val view = inflater?.inflate(R.layout.row_quest_reward_imageview, binding.rewardsList, false) as? ViewGroup + val imageView = view?.findViewById(R.id.imageView) + imageView?.scaleType = ImageView.ScaleType.CENTER + imageView?.setImageBitmap(HabiticaIconsHelper.imageOfGoldReward()) + val titleTextView = view?.findViewById(R.id.titleTextView) + titleTextView?.text = context.getString(R.string.gold_reward, questContent.drop?.gp) + binding.rewardsList.addView(view) + } + } + } + + private fun addRewardsRow(inflater: LayoutInflater?, item: QuestDropItem, containerView: ViewGroup?) { + val view = inflater?.inflate(R.layout.row_quest_reward, containerView, false) as? ViewGroup + val imageView = view?.findViewById(R.id.imageView) as? SimpleDraweeView + val titleTextView = view?.findViewById(R.id.titleTextView) as? TextView + DataBindingUtils.loadImage(imageView, item.imageName) + if (item.count > 1) { + titleTextView?.text = context.getString(R.string.quest_reward_count, item.text, item.count) + } else { + titleTextView?.text = item.text + } + containerView?.addView(view) + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt index 5ff7f7ddd..366fd1f20 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt @@ -62,6 +62,9 @@ class UserDeserializer : JsonDeserializer { user.party?.quest?.RSVPNeeded = quest.RSVPNeeded } } + if (obj.getAsJsonObject("party").getAsJsonObject("quest").has("completed")) { + user.party?.quest?.completed = obj.getAsJsonObject("party").getAsJsonObject("quest").get("completed").asString + } } } if (obj.has("purchased")) {