Skip to content

Commit 077084e

Browse files
committed
Created Wishlist tab for ASB armor selection.
1 parent 03be848 commit 077084e

File tree

5 files changed

+122
-29
lines changed

5 files changed

+122
-29
lines changed

app/src/main/java/com/ghstudios/android/features/armorsetbuilder/armorselect/ArmorExpandableListAdapter.kt renamed to app/src/main/java/com/ghstudios/android/features/armorsetbuilder/armorselect/ArmorAdapters.kt

Lines changed: 56 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.ghstudios.android.features.armorsetbuilder.armorselect
22

3+
import android.content.Context
34
import android.view.LayoutInflater
45
import android.view.View
56
import android.view.ViewGroup
7+
import android.widget.ArrayAdapter
68
import android.widget.BaseExpandableListAdapter
79
import com.ghstudios.android.AssetLoader
10+
import com.ghstudios.android.adapter.common.BasicListDelegationAdapter
811
import com.ghstudios.android.data.classes.Armor
912
import com.ghstudios.android.data.classes.ArmorSkillPoints
1013
import com.ghstudios.android.data.classes.Rank
@@ -13,11 +16,40 @@ import com.ghstudios.android.util.setImageAsset
1316
import kotlinx.android.synthetic.main.listitem_armor_header.view.*
1417
import kotlinx.android.synthetic.main.listitem_armor_piece.view.*
1518

19+
/**
20+
* A list of armor grouped by rarity.
21+
*/
1622
class ArmorGroup(
1723
val rarity: Int,
1824
val armor: List<ArmorSkillPoints>
1925
)
2026

27+
/**
28+
* Internal helper to bind armor skill points to a view.
29+
*/
30+
private fun bindArmorView(view: View, armorWithSkill: ArmorSkillPoints) {
31+
val armor = armorWithSkill.armor
32+
val skills = armorWithSkill.skills
33+
34+
view.icon.setImageAsset(armor)
35+
view.name.text = armor.name
36+
view.slots.setSlots(armor.numSlots, 0)
37+
38+
val skillsTvs = arrayOf(view.skill_1, view.skill_2, view.skill_3, view.skill_4)
39+
40+
// init skill views to invisible (in case this gets moved to a recycling view
41+
for (subView in skillsTvs) {
42+
subView.visibility = View.GONE
43+
}
44+
45+
for((i, skill) in skills.withIndex()) {
46+
skillsTvs[i]?.visibility = View.VISIBLE
47+
val points = skill.points
48+
val skillString = skill.skillTree.name + if(points>0) "+$points" else points
49+
skillsTvs[i]?.text = skillString
50+
}
51+
}
52+
2153
/**
2254
* Creates an adapter to display a collapsible list of armor.
2355
* Uses ListView instead of RecyclerView as the BaseExpandableListAdapter class we're using
@@ -60,34 +92,39 @@ class ArmorExpandableListAdapter(val armorGroups: List<ArmorGroup>) : BaseExpand
6092
override fun getChildView(groupPosition: Int, childPosition: Int, isLastChild: Boolean, convertView: View?, parent: ViewGroup?): View {
6193
val inflater = LayoutInflater.from(parent?.context)
6294
val view = convertView ?: inflater.inflate(R.layout.listitem_armor_piece, parent, false)
63-
6495
val armorWithSkill = getChild(groupPosition, childPosition)
65-
val armor = armorWithSkill.armor
66-
val skills = armorWithSkill.skills
6796

68-
view.icon.setImageAsset(armor)
69-
view.name.text = armor.name
70-
view.slots.setSlots(armor.numSlots, 0)
97+
bindArmorView(view, armorWithSkill)
98+
view.setOnClickListener {
99+
onArmorSelected?.invoke(armorWithSkill.armor)
100+
}
71101

72-
val skillsTvs = arrayOf(view.skill_1, view.skill_2, view.skill_3, view.skill_4)
102+
return view
103+
}
104+
}
73105

74-
// init skill views to invisible (in case this gets moved to a recycling view
75-
for (subView in skillsTvs) {
76-
subView.visibility = View.GONE
77-
}
106+
/**
107+
* Adapter used to display the armor pieces in a list view
108+
*/
109+
class ArmorListAdapter(
110+
ctx: Context,
111+
val armor: List<ArmorSkillPoints>
112+
): ArrayAdapter<ArmorSkillPoints>(ctx, R.layout.listitem_armor_header, armor) {
113+
/**
114+
* Sets the on armor selection callback
115+
*/
116+
var onArmorSelected: ((Armor) -> Unit)? = null
78117

79-
for((i, skill) in skills.withIndex()) {
80-
skillsTvs[i]?.visibility = View.VISIBLE
81-
val points = skill.points
82-
val skillString = skill.skillTree.name + if(points>0) "+$points" else points
83-
skillsTvs[i]?.text = skillString
84-
}
118+
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
119+
val inflater = LayoutInflater.from(parent?.context)
120+
val view = convertView ?: inflater.inflate(R.layout.listitem_armor_piece, parent, false)
121+
val armorWithSkill = getItem(position)
122+
bindArmorView(view, armorWithSkill)
85123

86124
view.setOnClickListener {
87-
onArmorSelected?.invoke(armor)
125+
onArmorSelected?.invoke(armorWithSkill.armor)
88126
}
89127

90128
return view
91129
}
92-
93130
}

app/src/main/java/com/ghstudios/android/features/armorsetbuilder/armorselect/ArmorSelectActivity.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,20 @@ import android.os.Bundle
55
import android.support.v4.app.Fragment
66
import android.view.Menu
77
import android.view.MenuInflater
8+
import com.ghstudios.android.BasePagerActivity
89
import com.ghstudios.android.GenericActivity
910
import com.ghstudios.android.MenuSection
1011
import com.ghstudios.android.data.classes.ArmorSet
1112
import com.ghstudios.android.data.classes.Rank
1213
import com.ghstudios.android.features.armorsetbuilder.detail.ASBDetailPagerActivity
1314
import com.ghstudios.android.mhgendatabase.R
1415

15-
class ArmorSelectActivity : GenericActivity() {
16+
class ArmorSelectActivity : BasePagerActivity() {
1617
private val viewModel by lazy {
1718
ViewModelProviders.of(this).get(ArmorSelectViewModel::class.java)
1819
}
1920

20-
override fun onCreate(savedInstanceState: Bundle?) {
21-
super.onCreate(savedInstanceState)
22-
21+
override fun onAddTabs(tabs: TabAdder) {
2322
val asbPieceIndex = intent.getIntExtra(ASBDetailPagerActivity.EXTRA_PIECE_INDEX, -1)
2423
val rankValue = intent.getSerializableExtra(ASBDetailPagerActivity.EXTRA_SET_RANK) as Rank?
2524
val hunterType = intent.getIntExtra(ASBDetailPagerActivity.EXTRA_SET_HUNTER_TYPE, -1)
@@ -34,10 +33,9 @@ class ArmorSelectActivity : GenericActivity() {
3433
})
3534

3635
viewModel.initialize(asbPieceIndex, rankValue ?: Rank.ANY, hunterType)
37-
}
3836

39-
override fun createFragment(): Fragment {
40-
return ArmorSelectAllFragment()
37+
tabs.addTab(R.string.asb_title_armor_all) { ArmorSelectAllFragment() }
38+
tabs.addTab(R.string.wishlist) { ArmorSelectWishlistFragment() }
4139
}
4240

4341
override fun getSelectedSection() = MenuSection.ARMOR_SET_BUILDER

app/src/main/java/com/ghstudios/android/features/armorsetbuilder/armorselect/ArmorSelectViewModel.kt

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ package com.ghstudios.android.features.armorsetbuilder.armorselect
33
import android.arch.lifecycle.MutableLiveData
44
import android.arch.lifecycle.Transformations
55
import android.arch.lifecycle.ViewModel
6-
import com.ghstudios.android.data.classes.Armor
76
import com.ghstudios.android.data.DataManager
8-
import com.ghstudios.android.data.classes.ArmorSet
9-
import com.ghstudios.android.data.classes.Rank
7+
import com.ghstudios.android.data.classes.*
108
import com.ghstudios.android.data.util.SearchFilter
119
import com.ghstudios.android.util.loggedThread
1210

@@ -56,6 +54,8 @@ class ArmorSelectViewModel : ViewModel() {
5654
}
5755
}
5856

57+
val armorWishlistData = MutableLiveData<List<ArmorSkillPoints>>()
58+
5959
fun initialize(asbIndex: Int, rankFilter: Rank, hunterType: Int) {
6060
val armorSlot = getSlotForPieceIndex(asbIndex)
6161
loggedThread("Armor Select armor loading") {
@@ -84,6 +84,25 @@ class ArmorSelectViewModel : ViewModel() {
8484

8585
allArmorData.postValue(allArmorItems)
8686
filterValue.postValue("")
87+
88+
// load wishlist data
89+
val wishlistArmorIds = mutableSetOf<Long>()
90+
val wishlistManager = dataManager.wishlistManager
91+
for (wishlist in wishlistManager.getWishlists()) {
92+
for (data in wishlistManager.getWishlistItems(wishlist.id)) {
93+
if (data.item.type == ItemType.ARMOR) {
94+
wishlistArmorIds.add(data.item.id)
95+
}
96+
}
97+
}
98+
99+
// Now go over the armor pieces loaded above, only taking those existing in wishlists.
100+
// This creates an interesection of filter armors and wishlist armors
101+
val wishlistArmors = allArmorItems.asSequence()
102+
.flatMap { it.armor.asSequence() }
103+
.filter { it.armor.id in wishlistArmorIds }
104+
.toList()
105+
armorWishlistData.postValue(wishlistArmors)
87106
}
88107
}
89108

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.ghstudios.android.features.armorsetbuilder.armorselect
2+
3+
import android.arch.lifecycle.Observer
4+
import android.arch.lifecycle.ViewModelProviders
5+
import android.os.Bundle
6+
import android.support.v4.app.Fragment
7+
import android.support.v4.app.ListFragment
8+
import android.view.LayoutInflater
9+
import android.view.View
10+
import android.view.ViewGroup
11+
import com.ghstudios.android.mhgendatabase.R
12+
13+
/**
14+
* Fragment used to display armor pieces that are currently in wishlists.
15+
*/
16+
class ArmorSelectWishlistFragment: ListFragment() {
17+
/**
18+
* ViewModel (anchored to parent)
19+
*/
20+
private val viewModel by lazy {
21+
ViewModelProviders.of(activity!!).get(ArmorSelectViewModel::class.java)
22+
}
23+
24+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
25+
return inflater.inflate(R.layout.fragment_generic_list, container, false)
26+
}
27+
28+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
29+
super.onViewCreated(view, savedInstanceState)
30+
31+
viewModel.armorWishlistData.observe(this, Observer {
32+
if (it == null) return@Observer
33+
34+
val adapter = ArmorListAdapter(context!!, it)
35+
listAdapter = adapter
36+
})
37+
}
38+
}

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@
397397
<string name="asb_title_select_arms">Select Arms</string>
398398
<string name="asb_title_select_waist">Select Waist</string>
399399
<string name="asb_title_select_legs">Select Legs</string>
400+
<string name="asb_title_armor_all">All</string>
400401

401402
<string name="asb_empty_slot">Empty slot</string>
402403
<string name="asb_no_slots">No slots</string>

0 commit comments

Comments
 (0)