Bimba.git

ref: 68ce87cc826a5c4c649ea1eb300eb20acfa5faba

app/src/main/java/ml/adamsprogs/bimba/models/adapters/FavouriteEditRowAdapter.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
package ml.adamsprogs.bimba.models.adapters

import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import kotlinx.coroutines.experimental.DefaultDispatcher
import kotlinx.coroutines.experimental.android.UI
import kotlinx.coroutines.experimental.launch
import kotlinx.coroutines.experimental.withContext
import ml.adamsprogs.bimba.ProviderProxy
import ml.adamsprogs.bimba.R
import ml.adamsprogs.bimba.collections.FavouriteStorage
import ml.adamsprogs.bimba.models.Favourite
import ml.adamsprogs.bimba.models.Plate
import ml.adamsprogs.bimba.models.StopSegment


class FavouriteEditRowAdapter(private var favourite: Favourite, private val loadingView: View, private val listView: View) :
        RecyclerView.Adapter<FavouriteEditRowAdapter.ViewHolder>() {

    private val segments = HashMap<String, StopSegment>()
    private val providerProxy = ProviderProxy()
    private val favourites = FavouriteStorage.getFavouriteStorage()
    private val platesList = ArrayList<Plate.ID>()
    private val namesList = HashMap<Plate.ID, String>()

    init {
        launch(UI) {
            withContext(DefaultDispatcher) {
                favourite.segments.forEach {
                    if (it.plates == null) {
                        (providerProxy.fillStopSegment(it) ?: it).let { segment ->
                            segments[segment.stop] = segment
                            it.plates = segment.plates
                        }
                    } else {
                        segments[it.stop] = it
                    }
                }
                favourites[favourite.name] = favourite

                segments.flatMap {
                    it.value.plates ?: emptyList<Plate.ID>()
                }.sortedBy { "${it.line}${it.stop}" }.forEach {
                    platesList.add(it)
                    namesList[it] = providerProxy.getStopName(it.stop).let { name ->
                        "${name ?: ""} (${it.stop}):\n${it.line}${it.headsign}"
                    }
                }
                launch(UI) {
                    loadingView.visibility = View.GONE
                    listView.visibility = View.VISIBLE
                    this@FavouriteEditRowAdapter.notifyDataSetChanged()
                }
            }
        }
    }


    override fun getItemCount(): Int = platesList.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        launch(UI) {
            val id = platesList[position]
            val favouriteElement = namesList[id]

            holder.rowTextView.text = favouriteElement
            holder.deleteButton.setOnClickListener {
                launch(UI) {
                    favourites.delete(favourite.name, id)
                    favourite = favourites.favourites[favourite.name]!!
                    notifyItemRemoved(platesList.indexOf(id))
                    platesList.remove(id)
                    namesList.remove(id)
                }
            }
        }
    }

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

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

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val rowTextView: TextView = itemView.findViewById(R.id.favourite_edit_row)
        val deleteButton: ImageView = itemView.findViewById(R.id.favourite_edit_delete)
    }
}