aboutsummaryrefslogtreecommitdiff
path: root/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt
blob: dd7333d7f1f736464ee8f6f22e4f99e971c4308b (plain)
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
package mx.trackermap.TrackerMap.android.devices

import android.graphics.Color
import android.graphics.ColorFilter
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewStructure
import androidx.core.content.res.ResourcesCompat
import androidx.recyclerview.widget.RecyclerView
import kotlinx.serialization.json.JsonNull
import mx.trackermap.TrackerMap.android.R
import mx.trackermap.TrackerMap.android.databinding.UnitItemBinding
import mx.trackermap.TrackerMap.client.models.UnitInformation

enum class Action {
    DETAILS, REPORTS, COMMANDS
}

typealias ActionCallback = (unit: UnitInformation, action: Action) -> Unit

class DevicesAdapter(
    private val units: List<UnitInformation>,
    private val actionCallback: ActionCallback?
) : RecyclerView.Adapter<DevicesAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = UnitItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)

        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.toggleOptions(false)

        val unit = units[position]
        val context = holder.itemView.context
        holder.binding.apply {

            unit.position?.let { position ->
                /* Status icon */
                position.speed?.let { speed ->
                    if (speed >= 2) {
                        statusIcon.setColorFilter(Color.GREEN)
                    } else {
                        statusIcon.setColorFilter(Color.RED)
                    }
                } ?: run {
                    statusIcon.setColorFilter(Color.GRAY)
                }

                /* Engine stop */
                val attributes = position.attributes
                if (attributes["out1"].toString() == "null") {
                    engineStopIcon.visibility = View.GONE
                } else {
                    engineStopIcon.visibility = View.VISIBLE
                    engineStopIcon.setImageResource(
                        when (attributes["out1"].toString()) {
                            "true" -> R.drawable.ic_baseline_lock_24
                            "false" -> R.drawable.ic_baseline_lock_open_24
                            else -> R.drawable.ic_baseline_lock_open_24
                        }
                    )
                    engineStopIcon.contentDescription = when (attributes["out1"].toString()) {
                        "true" -> context.getString(R.string.unit_lock_on)
                        "false" -> context.getString(R.string.unit_lock_off)
                        else -> context.getString(R.string.unit_lock_on)
                    }
                }
            }

            unitName.text = unit.device.name
            driverName.text = unit.device.contact
            unitSpeed.text = context.getString(R.string.unit_speed_format, unit.position?.speed?.toInt() ?: 0)
            lastAddress.text = unit.position?.address
            lastDate.text = "yyyy/mm/dd, hh:mm"
            actionCallback?.let { callback ->
                detailsButton.setOnClickListener { callback(unit, Action.DETAILS) }
                reportsButton.setOnClickListener { callback(unit, Action.REPORTS) }
                commandsButton.setOnClickListener { callback(unit, Action.COMMANDS) }
            }
        }
    }

    override fun getItemCount(): Int = units.size

    inner class ViewHolder(val binding: UnitItemBinding) : RecyclerView.ViewHolder(binding.root) {
        init {
            binding.unitCard.setOnClickListener {
                toggleOptions(binding.itemOptions.visibility == View.GONE)
            }
        }

        fun toggleOptions(shouldExpand: Boolean) {
            val context = binding.root.context
            binding.unitCard.setCardBackgroundColor(
                ResourcesCompat.getColor(
                    context.resources,
                    if (shouldExpand)  R.color.background else R.color.darkBackground,
                    context.theme
                )
            )
            binding.itemOptions.visibility = if (shouldExpand) View.VISIBLE else View.GONE
            binding.unitCard.cardElevation = if (shouldExpand) 5.0F else 0.0F
        }
    }
}