show challenge achievements. Fixes #1394

This commit is contained in:
Phillip Thelen 2020-11-10 17:57:38 +01:00
parent ad7dc9023a
commit 6780486617
5 changed files with 82 additions and 35 deletions

View 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>

View file

@ -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

View file

@ -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
}
}
}

View file

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

View file

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