mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-07-19 04:14:12 +00:00
show challenge achievements. Fixes #1394
This commit is contained in:
parent
ad7dc9023a
commit
6780486617
5 changed files with 82 additions and 35 deletions
28
Habitica/res/layout/achievement_challenge_item.xml
Normal file
28
Habitica/res/layout/achievement_challenge_item.xml
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingTop="13dp"
|
||||
android:paddingBottom="13dp">
|
||||
<TextView
|
||||
android:id="@+id/achievement_count_label"
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="40dp"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/text_ternary"
|
||||
style="@style/Body1"
|
||||
android:background="@drawable/circle_offset"
|
||||
tools:text="12"
|
||||
android:layout_marginStart="35dp"
|
||||
android:layout_marginEnd="25dp"/>
|
||||
<TextView
|
||||
android:id="@+id/achievement_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/Body1"
|
||||
android:textColor="@color/text_secondary"
|
||||
tools:text="This is the quest title"/>
|
||||
</LinearLayout>
|
||||
|
|
@ -156,6 +156,7 @@ open class User : RealmObject(), BaseObject, Avatar, VersionedObject {
|
|||
field = value
|
||||
field.forEach { it.userID = id }
|
||||
}
|
||||
var challengeAchievements = RealmList<String>()
|
||||
|
||||
@Ignore
|
||||
var pushDevices: List<PushDevice>? = null
|
||||
|
|
|
|||
|
|
@ -18,12 +18,12 @@ class AchievementsAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
|||
|
||||
var useGridLayout: Boolean = false
|
||||
var entries = listOf<Any>()
|
||||
var questAchievements = listOf<QuestAchievement>()
|
||||
|
||||
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<RecyclerView.ViewHolder>() {
|
|||
}
|
||||
|
||||
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<RecyclerView.ViewHolder>() {
|
|||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,13 +89,18 @@ class AchievementsFragment: BaseMainFragment<FragmentRefreshRecyclerviewBinding>
|
|||
(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<Any>()
|
||||
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<FragmentRefreshRecyclerviewBinding>
|
|||
}
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -179,6 +179,13 @@ class UserDeserializer : JsonDeserializer<User> {
|
|||
}
|
||||
user.questAchievements = questAchievements
|
||||
}
|
||||
if (achievements.has("challenges")) {
|
||||
val challengeAchievements = RealmList<String>()
|
||||
for (entry in achievements.getAsJsonArray("challenges")) {
|
||||
challengeAchievements.add(entry.asString)
|
||||
}
|
||||
user.challengeAchievements = challengeAchievements
|
||||
}
|
||||
}
|
||||
|
||||
if (obj.has("_ABTests")) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue