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