From 6780486617a1e7892ad459d5a493f65097c5785e Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 10 Nov 2020 17:57:38 +0100 Subject: [PATCH] show challenge achievements. Fixes #1394 --- .../res/layout/achievement_challenge_item.xml | 28 ++++++++++++ .../android/habitica/models/user/User.kt | 1 + .../ui/adapter/AchievementsAdapter.kt | 44 ++++++++++--------- .../ui/fragments/AchievementsFragment.kt | 37 +++++++++------- .../habitica/utils/UserDeserializer.kt | 7 +++ 5 files changed, 82 insertions(+), 35 deletions(-) create mode 100644 Habitica/res/layout/achievement_challenge_item.xml diff --git a/Habitica/res/layout/achievement_challenge_item.xml b/Habitica/res/layout/achievement_challenge_item.xml new file mode 100644 index 000000000..0fff98a27 --- /dev/null +++ b/Habitica/res/layout/achievement_challenge_item.xml @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt index 6e1281bf8..7790b3360 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt @@ -156,6 +156,7 @@ open class User : RealmObject(), BaseObject, Avatar, VersionedObject { field = value field.forEach { it.userID = id } } + var challengeAchievements = RealmList() @Ignore var pushDevices: List? = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt index 5948bc7d6..6c63b0a4b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt @@ -18,12 +18,12 @@ class AchievementsAdapter: RecyclerView.Adapter() { var useGridLayout: Boolean = false var entries = listOf() - var questAchievements = listOf() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { 0 -> SectionViewHolder(parent.inflate(R.layout.achievement_section_header)) 3 -> QuestAchievementViewHolder(parent.inflate(R.layout.achievement_quest_item)) + 4 -> ChallengeAchievementViewHolder(parent.inflate(R.layout.achievement_challenge_item)) else -> AchievementViewHolder(if (useGridLayout) { parent.inflate(R.layout.achievement_grid_item) } else { @@ -33,32 +33,28 @@ class AchievementsAdapter: RecyclerView.Adapter() { } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - when { - entries.size > position -> when (val entry = entries[position]) { - is Achievement -> (holder as? AchievementViewHolder)?.bind(entry) - is Pair<*, *> -> (holder as? SectionViewHolder)?.bind(entry) - } - entries.size == position -> (holder as? SectionViewHolder)?.bind(Pair("Quests completed", questAchievements.size)) - else -> (holder as? QuestAchievementViewHolder)?.bind(questAchievements[position - 1 - entries.size]) + when (val entry = entries[position]) { + is Achievement -> (holder as? AchievementViewHolder)?.bind(entry) + is QuestAchievement -> (holder as? QuestAchievementViewHolder)?.bind(entry) + is String -> (holder as? ChallengeAchievementViewHolder)?.bind(entry) + is Pair<*, *> -> (holder as? SectionViewHolder)?.bind(entry) } } override fun getItemCount(): Int { - return entries.size + questAchievements.size + 1 + return entries.size } override fun getItemViewType(position: Int): Int { - return when { - entries.size > position -> { - val entry = entries[position] - if (entry is Pair<*, *>) { - 0 - } else { - if (useGridLayout) 1 else 2 - } - } - entries.size == position -> 0 - else -> 3 + val entry = entries[position] + return if (entry is Pair<*, *>) { + 0 + } else if (entry is QuestAchievement) { + 3 + } else if (entry is String) { + 4 + } else { + if (useGridLayout) 1 else 2 } } @@ -125,4 +121,12 @@ class AchievementsAdapter: RecyclerView.Adapter() { binding.achievementCountLabel.text = achievement.count.toString() } } + + class ChallengeAchievementViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { + private var binding = AchievementQuestItemBinding.bind(itemView) + + fun bind(challengeName: String) { + binding.achievementTitle.text = challengeName + } + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt index e59ccf5c7..76df6f228 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt @@ -89,13 +89,18 @@ class AchievementsFragment: BaseMainFragment (it.category?.first()?.toInt() ?: 2) * it.index } } - }.subscribe({ + }.zipWith(Flowables.combineLatest(userRepository.getQuestAchievements(), userRepository.getQuestAchievements() + .map { it.mapNotNull { achievement -> achievement.questKey } } + .flatMap { inventoryRepository.getQuestContent(it) }), { achievements, questAchievements -> + Pair(achievements, questAchievements) + }).subscribe({ + val achievements = it.first val entries = mutableListOf() var lastCategory = "" - it.forEach { achievement -> + achievements.forEach { achievement -> val categoryIdentifier = achievement.category ?: "" if (categoryIdentifier != lastCategory) { - val category = Pair(categoryIdentifier, it.count { check -> + val category = Pair(categoryIdentifier, achievements.count { check -> check.category == categoryIdentifier && check.earned }) entries.add(category) @@ -103,21 +108,23 @@ class AchievementsFragment: BaseMainFragment } entries.add(achievement) } + val questAchievements = it.second + entries.add(Pair("Quests completed", questAchievements.first.size)) + entries.addAll(questAchievements.first.map { achievement -> + val questContent = questAchievements.second.firstOrNull { achievement.questKey == it.key } + achievement.title = questContent?.text + achievement + }) + + val challengeAchievementCount = user?.challengeAchievements?.size ?: 0 + if (challengeAchievementCount > 0) { + entries.add(Pair("Challenges won", challengeAchievementCount)) + user?.challengeAchievements?.let { it1 -> entries.addAll(it1) } + } + adapter.entries = entries adapter.notifyDataSetChanged() }, RxErrorHandler.handleEmptyError())) - compositeSubscription.add(Flowables.combineLatest(userRepository.getQuestAchievements(), userRepository.getQuestAchievements() - .map { it.mapNotNull { achievement -> achievement.questKey } } - .flatMap { inventoryRepository.getQuestContent(it) }) - .subscribeWithErrorHandler { result -> - val achievements = result.first.map { achievement -> - val questContent = result.second.firstOrNull { achievement.questKey == it.key } - achievement.title = questContent?.text - achievement - } - adapter.questAchievements = achievements - adapter.notifyDataSetChanged() - }) } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { 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 eb4389494..68b1ab729 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 @@ -179,6 +179,13 @@ class UserDeserializer : JsonDeserializer { } user.questAchievements = questAchievements } + if (achievements.has("challenges")) { + val challengeAchievements = RealmList() + for (entry in achievements.getAsJsonArray("challenges")) { + challengeAchievements.add(entry.asString) + } + user.challengeAchievements = challengeAchievements + } } if (obj.has("_ABTests")) {