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

160 lines
7.0 KiB
Kotlin

package com.adlerosn.brasilfurfest.schedule.adapters
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AlertDialog
import androidx.recyclerview.widget.DiffUtil
import android.view.View
import android.view.ViewGroup
import com.adlerosn.brasilfurfest.R
import com.adlerosn.brasilfurfest.helper.*
import com.adlerosn.brasilfurfest.schedule.EventActivity
import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.convention.Event
import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.dataholder.PeekableEvent
import com.adlerosn.brasilfurfest.schedule.abstractDataTypes.managed.AttendeeConFavorite
import com.adlerosn.brasilfurfest.schedule.managers.ScheduleManagerGetter
import com.adlerosn.brasilfurfest.schedule.viewHolders.RecyclerViewHolder
import kotlinx.android.synthetic.main.listitem_schedule_eventlist_subitem_item.view.*
class DayHourEventsAdapter(
private var events: List<Event>,
private var customFavorites: List<AttendeeConFavorite>,
private val activity: Activity
): RecyclerViewAdapter() {
override fun getItemCount(): Int = events.size+customFavorites.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder =
RecyclerViewHolder(parent.context.layoutInflater.inflate(R.layout.listitem_schedule_eventlist_subitem_item, parent, false))
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) =
when (position<events.size){
true -> onBindViewHolderConbook(holder, position)
false -> onBindViewHolderCustom(holder, position-events.size)
}
init {
setHasStableIds(true)
}
override fun getItemId(position: Int) : Long = (events+customFavorites).hashCode().toLong()
fun onDataChanged(newEvents: List<Event>, newCustomFavorites: List<AttendeeConFavorite>){
val newData = newEvents+newCustomFavorites
val oldData = events+customFavorites
val diff = DiffUtil.calculateDiff(ListDiffCallback(oldData, newData))
activity.runOnUiThread {
events = newEvents
customFavorites = newCustomFavorites
diff.dispatchUpdatesTo(this)
}
}
private fun onBindViewHolderConbook(holder: RecyclerViewHolder, position: Int) {
val view = holder.itemView
val event = events[position]
val scheduleManager = ScheduleManagerGetter.get()
view.startText.text = event.timeRange.start.timeInMillis.formatAsHoursAndMinutes()
view.finishText.text = event.timeRange.finish.timeInMillis.formatAsHoursAndMinutes()
view.eventTitle.text = event.titles.solved
val subTitle = event.subtitles.solved!!.let { subtitle ->
if (!subtitle.isEmpty())
subtitle
else
event.places.map { place -> place.names.solved!! }.textuallyJoined
}
view.eventSubtitle.text = subTitle
if (event !in scheduleManager.attendeeFavorites) {
view.star.setImageResource(R.drawable.ic_star_border_black_24dp)
}
if (scheduleManager.attendeeFavorites.registrationTier.level !in event.attendableBy.map { it.level }) {
view.star.visibility = View.INVISIBLE
} else {
view.star.visibility = View.VISIBLE
}
if (event.language == null) {
view.flag.visibility = View.GONE
} else {
view.flag.visibility = View.VISIBLE
view.flag.setImageResource(event.language.drawableId)
}
if (view.star.visibility == View.VISIBLE) {
view.starButton.setOnClickListener { _ ->
val existing = scheduleManager.attendeeFavorites.find(event)
if (existing == null) {
scheduleManager.attendeeFavorites.add(
AttendeeConFavorite(
scheduleManager.convention,
event
)
)
view.star.setImageResource(R.drawable.ic_star_black_24dp)
} else {
scheduleManager.attendeeFavorites.remove(existing)
view.star.setImageResource(R.drawable.ic_star_border_black_24dp)
}
}
}
view.setOnClickListener {
activity.startActivity(
Intent(activity, EventActivity::class.java).apply {
putExtra("favorite", AttendeeConFavorite(
scheduleManager.convention,
event
)
)
putExtra("offerStar", true)
}
)
}
view.isLongClickable = true
bindPeekAndPop(
activity,
view as ViewGroup,
view,
if (view.star.visibility == View.VISIBLE) scheduleManager.attendeeFavorites.find(event) != null else null,
{ view.starButton.callOnClick() },
{ view.callOnClick() },
PeekableEvent(event)
)
}
private fun onBindViewHolderCustom(holder: RecyclerViewHolder, position: Int) {
val view = holder.itemView
val favorite = customFavorites[position]
val scheduleManager = ScheduleManagerGetter.get()
view.startText.text = favorite.timeRange.start.timeInMillis.formatAsHoursAndMinutes()
view.finishText.text = favorite.timeRange.finish.timeInMillis.formatAsHoursAndMinutes()
view.flag.visibility = View.GONE
view.eventTitle.text = favorite.getString()
view.eventSubtitle.text = favorite.getSecondaryString()
view.starButton.setOnClickListener {
val dialog = AlertDialog.Builder(activity).create()
dialog.setTitle(activity.getString(R.string.schedule_action_interest_remove))
dialog.setButton(AlertDialog.BUTTON_NEUTRAL, activity.getString(R.string.dialog_cancel)) { dialogInterface, _ ->
dialogInterface.dismiss()
}
dialog.setButton(AlertDialog.BUTTON_NEGATIVE, activity.getString(R.string.list_action_remove)) { dialogInterface, _ ->
scheduleManager.attendeeFavorites.remove(favorite)
dialogInterface.dismiss()
}
dialog.show()
}
view.setOnClickListener {
activity.startActivity(
Intent(activity, EventActivity::class.java).apply {
putExtra("favorite", favorite)
putExtra("offerStar", true)
}
)
}
bindPeekAndPop(
activity,
view as ViewGroup,
view,
if (view.star.visibility == View.VISIBLE) scheduleManager.attendeeFavorites.find(favorite) != null else null,
{ view.starButton.callOnClick() },
{ view.callOnClick() },
PeekableEvent(favorite)
)
}
}