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