aboutsummaryrefslogtreecommitdiff
path: root/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesFragment.kt
blob: b905bebe008e927e027c2f8262640b515177b7fe (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
110
package mx.trackermap.TrackerMap.android.devices

import android.content.Intent
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 androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import kotlin.time.ExperimentalTime
import kotlinx.coroutines.DelicateCoroutinesApi
import mx.trackermap.TrackerMap.android.databinding.DevicesFragmentBinding
import mx.trackermap.TrackerMap.android.details.DetailsActivity
import mx.trackermap.TrackerMap.android.shared.UnitRenderData
import mx.trackermap.TrackerMap.android.units.UnitsViewModel
import mx.trackermap.TrackerMap.client.models.UnitInformation

@DelicateCoroutinesApi
@ExperimentalTime
class DevicesFragment : Fragment() {

    private val unitsViewModel: UnitsViewModel by viewModels(
        ownerProducer = { requireActivity() }
    )

    private var _binding: DevicesFragmentBinding? = null
    private val binding get() = _binding!!

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

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

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

        setupList()
    }

    override fun onResume() {
        super.onResume()

        setupObservers()
    }

    override fun onPause() {
        super.onPause()

        removeObservers()
    }

    private fun setupList() {
        binding.devicesList.layoutManager = LinearLayoutManager(
            context, LinearLayoutManager.VERTICAL,
            false
        )
        binding.devicesList.adapter = DevicesAdapter(emptyList(), null)
        binding.infoLoading.root.visibility = View.VISIBLE
    }

    @DelicateCoroutinesApi
    private fun setupObservers() {
        Log.d("DevicesFragment", "setupObservers()")
        unitsViewModel.units.observe(viewLifecycleOwner) { units ->
            Log.d("DevicesFragment", "Success $units")
            binding.infoLoading.root.visibility = View.GONE
            binding.devicesList.swapAdapter(
                DevicesAdapter(units, this::itemAction),
                false
            )
        }
    }

    private fun removeObservers() {
        Log.d("DevicesFragment", "removeObservers()")
        unitsViewModel.units.removeObservers(viewLifecycleOwner)
    }

    private fun itemAction(unit: UnitInformation, action: UnitRenderData.Action) {
        when (action) {
            UnitRenderData.Action.DETAILS,
            UnitRenderData.Action.REPORTS,
            UnitRenderData.Action.COMMANDS -> {
                Log.d("DevicesFragment", "Action: $action - Unit: $unit")
                val activity = requireActivity()
                val intent = Intent(activity.applicationContext, DetailsActivity::class.java)
                intent.putExtra(DetailsActivity.DEVICE_ID_EXTRA, unit.device.id)
                intent.putExtra(DetailsActivity.DEVICE_NAME_EXTRA, unit.device.name)
                intent.putExtra(DetailsActivity.DEVICE_CATEGORY_EXTRA, unit.device.category)
                intent.putExtra(DetailsActivity.ACTION_EXTRA, action)
                startActivity(intent)
            }
            UnitRenderData.Action.CLICK -> {
                unitsViewModel.selectUnit(unit)
            }
        }
    }
}