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) } } } }