aboutsummaryrefslogtreecommitdiff
path: root/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt
blob: 4a0fab2f45b33d85e2561e0974eb52d95c27f72d (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
package mx.trackermap.TrackerMap.android.map

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.coroutines.DelicateCoroutinesApi
import mx.trackermap.TrackerMap.android.R
import mx.trackermap.TrackerMap.android.databinding.UnitMapFragmentBinding
import mx.trackermap.TrackerMap.android.units.UnitsViewModel
import mx.trackermap.TrackerMap.client.models.UnitInformation
import org.koin.androidx.viewmodel.ext.android.viewModel

@DelicateCoroutinesApi
class UnitMapFragment : Fragment() {

    private val unitsViewModel: UnitsViewModel by viewModel()

    private var _binding: UnitMapFragmentBinding? = null
    private val binding get() = _binding!!
    private lateinit var unitsMapFragment: MapFragment

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = UnitMapFragmentBinding.inflate(inflater)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        initializeMap()
        setupObservers()
    }

    private fun initializeMap() {
        unitsMapFragment = childFragmentManager.findFragmentById(R.id.unitsMap) as MapFragment
    }

    private fun setupObservers() {
        Log.d("MapFragment", "setupObservers()")

        unitsViewModel.units.observe(viewLifecycleOwner) { units ->
            Log.d("UnitMapFragment", "Available units: $units")

            unitsMapFragment.display(units.mapNotNull(this::unitToMarker).toTypedArray())
        }

        unitsViewModel.selectedUnit.observe(viewLifecycleOwner) { selectedUnit ->
            Log.d("UnitMapFragment", "Selected Unit: $selectedUnit")

            binding.mapUnitCard.visibility = if (selectedUnit == null) View.GONE else View.VISIBLE

            selectedUnit?.let { unit ->
                if (unit.position == null || unit.position!!.latitude == null || unit.position!!.longitude == null) {
                    return@let
                }

                binding.unitInfoTest.text = unit.device.contact
                unitsMapFragment.focusOn(unit.position!!.latitude!!, unit.position!!.longitude!!)
            }
        }
    }

    private fun unitToMarker(unit: UnitInformation): MapFragment.Marker? {
        if (unit.position == null || unit.position!!.latitude == null || unit.position!!.longitude == null) {
            return null
        }

        return MapFragment.Marker(
            unit.position!!.id!!,
            unit.position!!.latitude!!,
            unit.position!!.longitude!!,
            when (unit.device.category?.lowercase()) {
                "animal" -> MapFragment.MarkerType.ANIMAL
                "bicycle" -> MapFragment.MarkerType.BICYCLE
                "boat" -> MapFragment.MarkerType.BOAT
                "bus" -> MapFragment.MarkerType.BUS
                "car" -> MapFragment.MarkerType.CAR
                "crane" -> MapFragment.MarkerType.CRANE
                "helicopter" -> MapFragment.MarkerType.HELICOPTER
                "motorcycle" -> MapFragment.MarkerType.MOTORCYCLE
                "offroad" -> MapFragment.MarkerType.OFFROAD
                "person" -> MapFragment.MarkerType.PERSON
                "pickup" -> MapFragment.MarkerType.PICKUP
                "plane" -> MapFragment.MarkerType.PLANE
                "scooter" -> MapFragment.MarkerType.SCOOTER
                "ship" -> MapFragment.MarkerType.SHIP
                "tractor" -> MapFragment.MarkerType.TRACTOR
                "train" -> MapFragment.MarkerType.TRAIN
                "tram" -> MapFragment.MarkerType.TRAM
                "trolleybus" -> MapFragment.MarkerType.TROLLEYBUS
                "truck" -> MapFragment.MarkerType.TRUCK
                "van" -> MapFragment.MarkerType.VAN
                else -> MapFragment.MarkerType.DEFAULT
            }
        )
    }

}