1
1
package org.fossasia.openevent.general.search
2
2
3
+ import android.content.res.ColorStateList
3
4
import android.os.Bundle
4
5
import android.view.LayoutInflater
5
6
import android.view.MenuItem
6
7
import android.view.View
7
8
import android.view.ViewGroup
9
+ import android.widget.CompoundButton
8
10
import androidx.core.content.ContextCompat
9
11
import androidx.core.view.children
10
- import android.content.res.ColorStateList
11
12
import androidx.core.view.isVisible
12
13
import androidx.fragment.app.Fragment
13
14
import androidx.lifecycle.Observer
14
15
import androidx.navigation.Navigation
15
16
import androidx.navigation.fragment.navArgs
16
17
import androidx.recyclerview.widget.LinearLayoutManager
17
18
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
22
19
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
24
21
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
29
22
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
30
27
import org.fossasia.openevent.general.R
28
+ import org.fossasia.openevent.general.common.EventClickListener
29
+ import org.fossasia.openevent.general.common.FavoriteFabClickListener
31
30
import org.fossasia.openevent.general.di.Scopes
32
31
import org.fossasia.openevent.general.event.Event
33
- import org.fossasia.openevent.general.common.EventClickListener
34
32
import org.fossasia.openevent.general.event.EventDetailsFragmentArgs
35
- import org.fossasia.openevent.general.common.FavoriteFabClickListener
33
+ import org.fossasia.openevent.general.event.types.EventType
36
34
import org.fossasia.openevent.general.favorite.FavoriteEventsRecyclerAdapter
37
35
import org.fossasia.openevent.general.utils.Utils.getAnimFade
36
+ import org.fossasia.openevent.general.utils.Utils.setToolbar
38
37
import org.fossasia.openevent.general.utils.extensions.nonNull
38
+ import org.jetbrains.anko.design.longSnackbar
39
39
import org.koin.android.ext.android.inject
40
40
import org.koin.androidx.scope.ext.android.bindScope
41
41
import org.koin.androidx.scope.ext.android.getOrCreateScope
42
42
import org.koin.androidx.viewmodel.ext.android.viewModel
43
43
import timber.log.Timber
44
- import org.fossasia.openevent.general.utils.Utils.setToolbar
45
- import org.jetbrains.anko.design.longSnackbar
46
44
47
- class SearchResultsFragment : Fragment () {
45
+ class SearchResultsFragment : Fragment (), CompoundButton.OnCheckedChangeListener {
46
+
48
47
private lateinit var rootView: View
49
48
private val searchViewModel by viewModel<SearchViewModel >()
50
49
private val safeArgs: SearchResultsFragmentArgs by navArgs()
51
50
private val favoriteEventsRecyclerAdapter: FavoriteEventsRecyclerAdapter by inject(
52
51
scope = getOrCreateScope(Scopes .SEARCH_RESULTS_FRAGMENT .toString())
53
52
)
54
-
53
+ lateinit var days: Array <String >
54
+ private var eventTypesList: List <EventType >? = arrayListOf ()
55
55
override fun onCreate (savedInstanceState : Bundle ? ) {
56
56
super .onCreate(savedInstanceState)
57
57
bindScope(getOrCreateScope(Scopes .SEARCH_RESULTS_FRAGMENT .toString()))
58
58
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)
59
66
}
60
67
61
68
override fun onCreateView (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ): View ? {
62
69
rootView = inflater.inflate(R .layout.fragment_search_results, container, false )
63
70
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)
95
72
setToolbar(activity, getString(R .string.search_results))
96
73
setHasOptionsMenu(true )
97
74
@@ -149,19 +126,66 @@ class SearchResultsFragment : Fragment() {
149
126
return rootView
150
127
}
151
128
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
+
152
176
override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
153
177
super .onViewCreated(view, savedInstanceState)
154
178
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
+ }
162
187
}
163
188
}
164
-
165
189
val favFabClickListener: FavoriteFabClickListener = object : FavoriteFabClickListener {
166
190
override fun onClick (event : Event , itemPosition : Int ) {
167
191
searchViewModel.setFavorite(event.id, ! event.favorite)
@@ -176,10 +200,10 @@ class SearchResultsFragment : Fragment() {
176
200
}
177
201
}
178
202
179
- private fun performSearch (args : SearchResultsFragmentArgs , eventDate : String = "") {
203
+ private fun performSearch (args : SearchResultsFragmentArgs , eventDate : String = "", eventType : String = "" ) {
180
204
val query = args.query
181
205
val location = args.location
182
- val type = args.type
206
+ val type = if (eventType.isNotEmpty()) eventType else args.type
183
207
val date = if (eventDate.isNotEmpty()) eventDate else args.date
184
208
searchViewModel.searchEvent = query
185
209
searchViewModel.loadEvents(location, date, type)
@@ -203,4 +227,26 @@ class SearchResultsFragment : Fragment() {
203
227
else -> super .onOptionsItemSelected(item)
204
228
}
205
229
}
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
+ }
206
252
}
0 commit comments