Skip to content

Commit 3cb14ed

Browse files
feat: add Event Types Chips
1 parent 75180e7 commit 3cb14ed

File tree

5 files changed

+120
-97
lines changed

5 files changed

+120
-97
lines changed

app/src/main/java/org/fossasia/openevent/general/event/types/EventType.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import com.github.jasminb.jsonapi.annotations.Type
1111
data class EventType(
1212
@Id(LongIdHandler::class)
1313
@PrimaryKey
14-
val id: Long?,
15-
val name: String?,
16-
val slug: String?
14+
val id: Long,
15+
val name: String,
16+
val slug: String
1717
)

app/src/main/java/org/fossasia/openevent/general/search/SearchResultsFragment.kt

Lines changed: 103 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,74 @@
11
package org.fossasia.openevent.general.search
22

3+
import android.content.res.ColorStateList
34
import android.os.Bundle
45
import android.view.LayoutInflater
56
import android.view.MenuItem
67
import android.view.View
78
import android.view.ViewGroup
9+
import android.widget.CompoundButton
810
import androidx.core.content.ContextCompat
911
import androidx.core.view.children
10-
import android.content.res.ColorStateList
1112
import androidx.core.view.isVisible
1213
import androidx.fragment.app.Fragment
1314
import androidx.lifecycle.Observer
1415
import androidx.navigation.Navigation
1516
import androidx.navigation.fragment.navArgs
1617
import androidx.recyclerview.widget.LinearLayoutManager
1718
import com.google.android.material.chip.Chip
18-
import kotlinx.android.synthetic.main.fragment_search_results.view.searchRootLayout
19-
import kotlinx.android.synthetic.main.fragment_search_results.view.eventsRecycler
20-
import kotlinx.android.synthetic.main.fragment_search_results.view.shimmerSearch
21-
import kotlinx.android.synthetic.main.content_no_internet.view.retry
2219
import kotlinx.android.synthetic.main.content_no_internet.view.noInternetCard
23-
import kotlinx.android.synthetic.main.fragment_search_results.view.noSearchResults
20+
import kotlinx.android.synthetic.main.content_no_internet.view.retry
2421
import kotlinx.android.synthetic.main.fragment_search_results.view.chipGroup
25-
import kotlinx.android.synthetic.main.fragment_search_results.view.todayChip
26-
import kotlinx.android.synthetic.main.fragment_search_results.view.tomorrowChip
27-
import kotlinx.android.synthetic.main.fragment_search_results.view.weekendChip
28-
import kotlinx.android.synthetic.main.fragment_search_results.view.monthChip
2922
import kotlinx.android.synthetic.main.fragment_search_results.view.chipGroupLayout
23+
import kotlinx.android.synthetic.main.fragment_search_results.view.eventsRecycler
24+
import kotlinx.android.synthetic.main.fragment_search_results.view.noSearchResults
25+
import kotlinx.android.synthetic.main.fragment_search_results.view.searchRootLayout
26+
import kotlinx.android.synthetic.main.fragment_search_results.view.shimmerSearch
3027
import org.fossasia.openevent.general.R
28+
import org.fossasia.openevent.general.common.EventClickListener
29+
import org.fossasia.openevent.general.common.FavoriteFabClickListener
3130
import org.fossasia.openevent.general.di.Scopes
3231
import org.fossasia.openevent.general.event.Event
33-
import org.fossasia.openevent.general.common.EventClickListener
3432
import org.fossasia.openevent.general.event.EventDetailsFragmentArgs
35-
import org.fossasia.openevent.general.common.FavoriteFabClickListener
33+
import org.fossasia.openevent.general.event.types.EventType
3634
import org.fossasia.openevent.general.favorite.FavoriteEventsRecyclerAdapter
3735
import org.fossasia.openevent.general.utils.Utils.getAnimFade
36+
import org.fossasia.openevent.general.utils.Utils.setToolbar
3837
import org.fossasia.openevent.general.utils.extensions.nonNull
38+
import org.jetbrains.anko.design.longSnackbar
3939
import org.koin.android.ext.android.inject
4040
import org.koin.androidx.scope.ext.android.bindScope
4141
import org.koin.androidx.scope.ext.android.getOrCreateScope
4242
import org.koin.androidx.viewmodel.ext.android.viewModel
4343
import timber.log.Timber
44-
import org.fossasia.openevent.general.utils.Utils.setToolbar
45-
import org.jetbrains.anko.design.longSnackbar
4644

47-
class SearchResultsFragment : Fragment() {
45+
class SearchResultsFragment : Fragment(), CompoundButton.OnCheckedChangeListener {
46+
4847
private lateinit var rootView: View
4948
private val searchViewModel by viewModel<SearchViewModel>()
5049
private val safeArgs: SearchResultsFragmentArgs by navArgs()
5150
private val favoriteEventsRecyclerAdapter: FavoriteEventsRecyclerAdapter by inject(
5251
scope = getOrCreateScope(Scopes.SEARCH_RESULTS_FRAGMENT.toString())
5352
)
54-
53+
lateinit var days: Array<String>
54+
private var eventTypesList: List<EventType>? = arrayListOf()
5555
override fun onCreate(savedInstanceState: Bundle?) {
5656
super.onCreate(savedInstanceState)
5757
bindScope(getOrCreateScope(Scopes.SEARCH_RESULTS_FRAGMENT.toString()))
5858
performSearch(safeArgs)
59+
searchViewModel.loadEventTypes()
60+
searchViewModel.eventTypes
61+
.nonNull()
62+
.observe(this, Observer { list ->
63+
eventTypesList = list
64+
})
65+
days = resources.getStringArray(R.array.days)
5966
}
6067

6168
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
6269
rootView = inflater.inflate(R.layout.fragment_search_results, container, false)
6370

64-
val selectedChip = when (safeArgs.date) {
65-
getString(R.string.today) -> rootView.todayChip
66-
getString(R.string.tomorrow) -> rootView.tomorrowChip
67-
getString(R.string.weekend) -> rootView.weekendChip
68-
getString(R.string.month) -> rootView.monthChip
69-
else -> null
70-
}
71-
selectedChip?.apply {
72-
isChecked = true
73-
chipBackgroundColor = ColorStateList.valueOf(ContextCompat.getColor(requireContext(), R.color.colorPrimary))
74-
}
75-
76-
rootView.chipGroup.setOnCheckedChangeListener { chipGroup, id ->
77-
78-
chipGroup.children.forEach { chip ->
79-
if (chip is Chip) {
80-
if (chip.id != chipGroup.checkedChipId) {
81-
chip.chipBackgroundColor =
82-
ColorStateList.valueOf(ContextCompat.getColor(requireContext(), R.color.grey))
83-
chip.isClickable = true
84-
} else {
85-
chip.isClickable = false
86-
chip.chipBackgroundColor =
87-
ColorStateList.valueOf(ContextCompat.getColor(requireContext(), R.color.colorPrimary))
88-
rootView.noSearchResults.isVisible = false
89-
favoriteEventsRecyclerAdapter.submitList(null)
90-
performSearch(safeArgs, chip.text.toString())
91-
}
92-
}
93-
}
94-
}
71+
setChips(safeArgs.date, safeArgs.type)
9572
setToolbar(activity, getString(R.string.search_results))
9673
setHasOptionsMenu(true)
9774

@@ -149,19 +126,66 @@ class SearchResultsFragment : Fragment() {
149126
return rootView
150127
}
151128

129+
private fun setChips(date: String = safeArgs.date, type: String = safeArgs.type) {
130+
if (rootView.chipGroup.childCount>0) {
131+
rootView.chipGroup.removeAllViews()
132+
}
133+
when {
134+
date != getString(R.string.anytime) && type != getString(R.string.anything) -> {
135+
addchips(date, true)
136+
addchips(type, true)
137+
}
138+
date != getString(R.string.anytime) && type == getString(R.string.anything) -> {
139+
addchips(date, true)
140+
searchViewModel.eventTypes
141+
.nonNull()
142+
.observe(this, Observer { list ->
143+
list.forEach {
144+
addchips(it.name, false)
145+
}
146+
})
147+
}
148+
date == getString(R.string.anytime) && type != getString(R.string.anything) -> {
149+
addchips(type, true)
150+
days.forEach {
151+
addchips(it, false)
152+
}
153+
}
154+
else -> {
155+
days.forEach {
156+
addchips(it, false)
157+
}
158+
}
159+
}
160+
}
161+
162+
private fun addchips(name: String, checked: Boolean) {
163+
val chip = Chip(context)
164+
chip.text = name
165+
chip.isCheckable = true
166+
chip.isClickable = true
167+
chip.isChecked = checked
168+
if (checked) {
169+
chip.chipBackgroundColor =
170+
ColorStateList.valueOf(ContextCompat.getColor(requireContext(), R.color.colorPrimary))
171+
}
172+
chip.setOnCheckedChangeListener(this)
173+
rootView.chipGroup.addView(chip)
174+
}
175+
152176
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
153177
super.onViewCreated(view, savedInstanceState)
154178
val eventClickListener: EventClickListener = object : EventClickListener {
155-
override fun onClick(eventID: Long) { EventDetailsFragmentArgs.Builder()
156-
.setEventId(eventID)
157-
.build()
158-
.toBundle()
159-
.also { bundle ->
160-
Navigation.findNavController(view).navigate(R.id.eventDetailsFragment, bundle, getAnimFade())
161-
}
179+
override fun onClick(eventID: Long) {
180+
EventDetailsFragmentArgs.Builder()
181+
.setEventId(eventID)
182+
.build()
183+
.toBundle()
184+
.also { bundle ->
185+
Navigation.findNavController(view).navigate(R.id.eventDetailsFragment, bundle, getAnimFade())
186+
}
162187
}
163188
}
164-
165189
val favFabClickListener: FavoriteFabClickListener = object : FavoriteFabClickListener {
166190
override fun onClick(event: Event, itemPosition: Int) {
167191
searchViewModel.setFavorite(event.id, !event.favorite)
@@ -176,10 +200,10 @@ class SearchResultsFragment : Fragment() {
176200
}
177201
}
178202

179-
private fun performSearch(args: SearchResultsFragmentArgs, eventDate: String = "") {
203+
private fun performSearch(args: SearchResultsFragmentArgs, eventDate: String = "", eventType: String = "") {
180204
val query = args.query
181205
val location = args.location
182-
val type = args.type
206+
val type = if (eventType.isNotEmpty()) eventType else args.type
183207
val date = if (eventDate.isNotEmpty()) eventDate else args.date
184208
searchViewModel.searchEvent = query
185209
searchViewModel.loadEvents(location, date, type)
@@ -203,4 +227,26 @@ class SearchResultsFragment : Fragment() {
203227
else -> super.onOptionsItemSelected(item)
204228
}
205229
}
230+
override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
231+
if (isChecked) {
232+
days.forEach {
233+
if (it == buttonView?.text) {
234+
setChips(date = buttonView.text.toString())
235+
rootView.noSearchResults.isVisible = false
236+
favoriteEventsRecyclerAdapter.submitList(null)
237+
performSearch(safeArgs, eventDate = buttonView.text.toString())
238+
return@forEach
239+
}
240+
}
241+
eventTypesList?.forEach {
242+
if (it.name == buttonView?.text) {
243+
setChips(type = buttonView.text.toString())
244+
rootView.noSearchResults.isVisible = false
245+
favoriteEventsRecyclerAdapter.submitList(null)
246+
performSearch(safeArgs, eventType = buttonView.text.toString())
247+
return@forEach
248+
}
249+
}
250+
}
251+
}
206252
}

app/src/main/java/org/fossasia/openevent/general/search/SearchTypeFragment.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import androidx.fragment.app.Fragment
1010
import androidx.lifecycle.Observer
1111
import androidx.navigation.NavOptions
1212
import androidx.navigation.Navigation
13-
import androidx.navigation.fragment.navArgs
1413
import kotlinx.android.synthetic.main.fragment_search_type.view.eventTypesLv
1514
import org.fossasia.openevent.general.R
1615
import org.fossasia.openevent.general.utils.Utils.setToolbar
@@ -19,9 +18,8 @@ import org.koin.androidx.viewmodel.ext.android.viewModel
1918

2019
class SearchTypeFragment : Fragment() {
2120
private val searchTypeViewModel by viewModel<SearchTypeViewModel>()
22-
private val safeArgs: SearchTypeFragmentArgs by navArgs()
2321
private lateinit var rootView: View
24-
private val eventTypesList: MutableList<String> = ArrayList()
22+
private val eventTypesList: MutableList<String> = arrayListOf("Anything")
2523

2624
override fun onCreateView(
2725
inflater: LayoutInflater,
@@ -40,7 +38,7 @@ class SearchTypeFragment : Fragment() {
4038
.nonNull()
4139
.observe(this, Observer { list ->
4240
list.forEach {
43-
eventTypesList.add(it.name ?: "")
41+
eventTypesList.add(it.name)
4442
}
4543
adapter.notifyDataSetChanged()
4644
})

app/src/main/res/layout/fragment_search_results.xml

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -48,39 +48,9 @@
4848
android:layout_height="wrap_content">
4949

5050
<com.google.android.material.chip.ChipGroup
51-
android:layout_width="wrap_content"
52-
android:id="@+id/chipGroup"
53-
app:singleSelection="true"
54-
android:layout_height="wrap_content">
55-
56-
<com.google.android.material.chip.Chip
57-
style="@style/CustomChipChoice"
58-
android:layout_width="wrap_content"
59-
android:layout_height="wrap_content"
60-
android:id="@+id/todayChip"
61-
android:text="@string/today" />
62-
63-
<com.google.android.material.chip.Chip
64-
style="@style/CustomChipChoice"
65-
android:layout_width="wrap_content"
66-
android:layout_height="wrap_content"
67-
android:id="@+id/tomorrowChip"
68-
android:text="@string/tomorrow" />
69-
70-
<com.google.android.material.chip.Chip
71-
style="@style/CustomChipChoice"
72-
android:layout_width="wrap_content"
73-
android:id="@+id/weekendChip"
74-
android:layout_height="wrap_content"
75-
android:text="@string/weekend" />
76-
77-
<com.google.android.material.chip.Chip
78-
style="@style/CustomChipChoice"
79-
android:layout_width="wrap_content"
80-
android:layout_height="wrap_content"
81-
android:id="@+id/monthChip"
82-
android:text="@string/month" />
83-
</com.google.android.material.chip.ChipGroup>
51+
android:layout_width="wrap_content"
52+
android:id="@+id/chipGroup"
53+
android:layout_height="wrap_content" />
8454
</HorizontalScrollView>
8555

8656
<com.facebook.shimmer.ShimmerFrameLayout

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<array name="days">
4+
<item>@string/today</item>
5+
<item>@string/tomorrow</item>
6+
<item>@string/weekend</item>
7+
<item>@string/month</item>
8+
</array>
9+
</resources>

0 commit comments

Comments
 (0)