ref: 20e217c955b231d402ddd0a32a14d38b34f728b9
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 119 |
package ml.adamsprogs.bimba.models.adapters import android.app.AlertDialog import android.content.Context import android.content.DialogInterface import androidx.core.content.res.ResourcesCompat import androidx.recyclerview.widget.RecyclerView import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import ml.adamsprogs.bimba.R import android.view.LayoutInflater import ml.adamsprogs.bimba.Declinator 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) } } |