conventionschedule-android/app/src/main/java/com/adlerosn/brasilfurfest/schedule/SearchFilterActivity.kt

177 lines
7.4 KiB
Kotlin
Raw Normal View History

2018-12-12 04:30:34 +00:00
package com.adlerosn.brasilfurfest.schedule
import android.os.Bundle
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
2018-12-12 04:30:34 +00:00
import android.text.Editable
import android.text.TextWatcher
import com.adlerosn.brasilfurfest.R
2018-12-28 00:28:48 +00:00
import com.adlerosn.brasilfurfest.helper.*
import com.adlerosn.brasilfurfest.helper.observables.Observer
2018-12-13 02:04:29 +00:00
import com.adlerosn.brasilfurfest.schedule.managers.ScheduleManagerGetter
2018-12-13 21:06:50 +00:00
import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.convention.FilterableNamedColoredAttribute
2018-12-12 04:30:34 +00:00
import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.convention.Place
import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.convention.Tag
import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.dataholder.PeekableEvent
2018-12-13 21:06:50 +00:00
import com.adlerosn.brasilfurfest.schedule.adapters.FilterCriteriaRecyclerViewAdapter
2018-12-12 04:30:34 +00:00
import com.adlerosn.brasilfurfest.schedule.adapters.PeekableEventRecyclerViewAdapter
import com.adlerosn.brasilfurfest.schedule.adapters.TagTripleListAdapter
import kotlinx.android.synthetic.main.activity_search_filter.*
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread
class SearchFilterActivity : AppCompatActivity() {
val tags = mutableListOf<Tag>()
val places = mutableListOf<Place>()
var query = ""
2018-12-13 21:06:50 +00:00
val scheduleManager = ScheduleManagerGetter[this]
lateinit var filteredEventsListAdapter: PeekableEventRecyclerViewAdapter
lateinit var filterTagsListAdapter: FilterCriteriaRecyclerViewAdapter<Tag>
lateinit var filterPlacesListAdapter: FilterCriteriaRecyclerViewAdapter<Place>
2018-12-12 04:30:34 +00:00
lateinit var everyPeekableEvent: List<PeekableEvent>
val observer = Observer { _, _: Any? ->
2018-12-12 04:30:34 +00:00
runOnUiThread {
updateView()
}
}
2018-12-13 21:06:50 +00:00
private val nullPair = Pair(null, nullFun)
2018-12-12 04:30:34 +00:00
override fun onCreate(savedInstanceState: Bundle?) {
ActivitiesForFragments[this.javaClass.simpleName] = this
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_search_filter)
2018-12-28 00:28:48 +00:00
resourcesAliased = this.resources
2018-12-12 04:30:34 +00:00
scheduleManager.addObserver(observer)
queryText.addTextChangedListener(object: TextWatcher{
override fun afterTextChanged(s: Editable?) {
query = s.toString()
updateView()
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
})
val rl = recyclerList!!
2018-12-13 21:06:50 +00:00
val fct = filterCriteriaTags!!
val fcp = filterCriteriaPlaces!!
filteredEventsListAdapter = PeekableEventRecyclerViewAdapter(mutableListOf(), scheduleManager, this) {updateView()}
filterTagsListAdapter = FilterCriteriaRecyclerViewAdapter( listOf() ) { callAddTags() }
filterPlacesListAdapter = FilterCriteriaRecyclerViewAdapter( listOf() ) { callAddPlaces() }
rl.adapter = filteredEventsListAdapter
2018-12-12 04:30:34 +00:00
rl.layoutManager = LinearLayoutManager(this@SearchFilterActivity)
everyPeekableEvent = (
scheduleManager.convention.events.map { PeekableEvent(it) } +
2018-12-28 00:28:48 +00:00
scheduleManager.attendeeFavorites.toList().filter { it.isCustom }.map { PeekableEvent(it) }
2018-12-12 04:30:34 +00:00
).sortedWith(compareBy(
{ it.timeRange.start.timeInMillis },
{ it.timeRange.finish.timeInMillis },
2018-12-28 00:28:48 +00:00
{ it.title.solved }
2018-12-12 04:30:34 +00:00
))
2018-12-13 21:06:50 +00:00
fct.adapter = filterTagsListAdapter
fct.layoutManager = LinearLayoutManager(this@SearchFilterActivity, LinearLayoutManager.HORIZONTAL, false)
fcp.adapter = filterPlacesListAdapter
fcp.layoutManager = LinearLayoutManager(this@SearchFilterActivity, LinearLayoutManager.HORIZONTAL, false)
2018-12-12 04:30:34 +00:00
updateView()
}
override fun onBackPressed() {
scheduleManager.deleteObserver(observer)
super.onBackPressed()
}
2018-12-13 21:06:50 +00:00
private fun <T: FilterableNamedColoredAttribute> callAddSomething(
wholeCollection: Collection<T>,
currentCollection: MutableCollection<T>,
@StringRes dialogTitleResource: Int
){
2018-12-12 04:30:34 +00:00
doAsync {
2018-12-13 21:06:50 +00:00
val placeChoices = wholeCollection.filterNot {
it in currentCollection
2018-12-12 04:30:34 +00:00
}.map {
2018-12-28 00:28:48 +00:00
Triple(it.names.solved!!, it.color, { currentCollection.add(it) })
2018-12-13 21:06:50 +00:00
}
2018-12-12 04:30:34 +00:00
uiThread {
2018-12-13 21:06:50 +00:00
val choicesAdapted = TagTripleListAdapter(placeChoices)
AlertDialog.Builder(this@SearchFilterActivity)
.setTitle(dialogTitleResource)
.setAdapter(choicesAdapted) { dialog, which: Int ->
placeChoices[which].third()
dialog.dismiss()
updateView()
2018-12-12 04:30:34 +00:00
}
2018-12-13 21:06:50 +00:00
.show()
2018-12-12 04:30:34 +00:00
}
}
2018-12-13 21:06:50 +00:00
}
fun callAddPlaces() = callAddSomething(
scheduleManager.convention.places,
places,
R.string.schedule_event_key_places
)
fun callAddTags() = callAddSomething(
scheduleManager.convention.tags,
tags,
R.string.schedule_event_key_categories
)
fun <T: FilterableNamedColoredAttribute> updateFilterItemView(
wholeCollection: Collection<T>,
currentCollection: MutableCollection<T>,
adapter: FilterCriteriaRecyclerViewAdapter<T>
){
2018-12-12 04:30:34 +00:00
doAsync {
2018-12-13 21:06:50 +00:00
val hasPlusButtons = currentCollection.size < wholeCollection.size
val plusButtons = if (hasPlusButtons) listOf(nullPair) else listOf()
val filterableChoices = currentCollection.map {
Pair(it) { currentCollection.remove(it); updateView() }
}.let {
when (it.size) {
0 -> plusButtons
1 -> plusButtons+it
else -> plusButtons+it+plusButtons
2018-12-12 04:30:34 +00:00
}
}
2018-12-13 21:06:50 +00:00
uiThread {
adapter.onDataChanged(filterableChoices)
}
2018-12-12 04:30:34 +00:00
}
2018-12-13 21:06:50 +00:00
}
fun updateView() {
updateFilterItemView(
scheduleManager.convention.tags,
tags,
filterTagsListAdapter
)
updateFilterItemView(
scheduleManager.convention.places,
places,
filterPlacesListAdapter
)
2018-12-12 04:30:34 +00:00
doAsync {
val toRemoveByName = if (query.isEmpty()) listOf() else
everyPeekableEvent.filter {
2018-12-28 00:28:48 +00:00
(query.toLowerCase() !in it.title.solved?.toLowerCase()?:"")
2018-12-12 04:30:34 +00:00
&&
2018-12-28 00:28:48 +00:00
(query.toLowerCase() !in it.subtitles?.solved?.toLowerCase()?:"")
2018-12-12 04:30:34 +00:00
&&
2018-12-28 00:28:48 +00:00
(query.toLowerCase() !in it.descriptions?.solved?.toLowerCase()?:"")
2018-12-12 04:30:34 +00:00
}
val toRemoveByTag = if(tags.isEmpty()) listOf() else
everyPeekableEvent.filter { event ->
!tags.any { event.tags?.contains(it) ?: false }
}
val toRemoveByPlace = if(places.isEmpty()) listOf() else
everyPeekableEvent.filter { event ->
!places.any { event.places?.contains(it) ?: false }
}
val toDisplay = everyPeekableEvent - (toRemoveByName+toRemoveByTag+toRemoveByPlace).toSet()
2018-12-13 21:06:50 +00:00
filteredEventsListAdapter.onDataChanged(toDisplay)
2018-12-12 04:30:34 +00:00
}
}
}