Bimba.git

ref: 5d029c3915c5561fa70da7501930a6d58b8ce8c0

app/src/main/java/ml/adamsprogs/bimba/models/adapters/DeparturesAdapter.kt


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package ml.adamsprogs.bimba.models.adapters

import android.app.AlertDialog
import android.content.Context
import android.content.DialogInterface
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.res.ResourcesCompat
import ml.adamsprogs.bimba.Declinator
import ml.adamsprogs.bimba.R
import ml.adamsprogs.bimba.models.Departure
import ml.adamsprogs.bimba.rollTime
import java.util.*

class DeparturesAdapter(val context: Context, var departures: List<Departure>?, var relativeTime: Boolean) :
        androidx.recyclerview.widget.RecyclerView.Adapter<DeparturesAdapter.ViewHolder>() {

    companion object {
        const val VIEW_TYPE_LOADING: Int = 0
        const val VIEW_TYPE_CONTENT: Int = 1
    }

    override fun getItemCount(): Int {
        if (departures == null || departures!!.isEmpty())
            return 1
        return departures!!.size
    }

    override fun getItemViewType(position: Int): Int {
        return when {
            departures == null -> VIEW_TYPE_LOADING //empty
            departures!!.isEmpty() -> VIEW_TYPE_LOADING
            else -> VIEW_TYPE_CONTENT
        }
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.floorIcon.visibility = View.GONE
        holder.infoIcon.visibility = View.GONE

        if (departures == null) {
            return
        }

        val line = holder.lineTextView
        val time = holder.timeTextView
        val direction = holder.directionTextView
        if (departures!!.isEmpty()) {
            time.text = context.getString(R.string.no_departures)
            return
        }
        val departure = departures!![position]
        val now = Calendar.getInstance()
        val departureTime = Calendar.getInstance().rollTime(departure.time)
        if (departure.tomorrow)
            departureTime.add(Calendar.DAY_OF_MONTH, 1)

        val departureIn = ((departureTime.timeInMillis - now.timeInMillis) / (1000 * 60)).toInt()
        val timeString: String

        timeString = if (departureIn > 60 || departureIn < 0 || !relativeTime)
            context.getString(R.string.departure_at, "${String.format("%02d", departureTime.get(Calendar.HOUR_OF_DAY))}:${String.format("%02d", departureTime.get(Calendar.MINUTE))}")
        else if (departureIn > 0 && !departure.onStop)
            context.getString(Declinator.decline(departureIn), departureIn.toString())
        else
            context.getString(R.string.now)

        line.text = departure.lineText
        time.text = timeString
        direction.text = context.getString(R.string.departure_to, departure.headsign)
        val icon = holder.typeIcon
        if (departure.vm)
            icon.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_vm, context.theme))
        else
            icon.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_timetable, context.theme))

        if (departure.lowFloor)
            holder.floorIcon.visibility = View.VISIBLE
        if (departure.isModified)
            holder.infoIcon.visibility = View.VISIBLE
        holder.root.setOnClickListener {
            AlertDialog.Builder(context)
                    .setPositiveButton(context.getText(android.R.string.ok)
                    ) { dialog: DialogInterface, _: Int -> dialog.cancel() }
                    .setCancelable(true)
                    .setMessage(
                            context.getString(R.string.departure_at,
                                    "${String.format("%02d",
                                            departureTime.get(Calendar.HOUR_OF_DAY))}:${String.format("%02d",
                                            departureTime.get(Calendar.MINUTE))}")
                                    + if (departure.isModified)
                                " " + departure.modification.joinToString("; ", "(", ")")
                            else "")
                    .create().show()
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val context = parent.context
        val inflater = LayoutInflater.from(context)

        val rowView = inflater.inflate(R.layout.row_departure, parent, false)
        return ViewHolder(rowView)
    }

    inner class ViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView.ViewHolder(itemView) {
        val root = itemView.findViewById<View>(R.id.departureRow)!!
        val lineTextView: TextView = itemView.findViewById(R.id.lineNumber)
        val timeTextView: TextView = itemView.findViewById(R.id.departureTime)
        val directionTextView: TextView = itemView.findViewById(R.id.departureDirection)
        val typeIcon: ImageView = itemView.findViewById(R.id.departureTypeIcon)
        val infoIcon: ImageView = itemView.findViewById(R.id.departureInfoIcon)
        val floorIcon: ImageView = itemView.findViewById(R.id.departureFloorIcon)
    }
}