/** * TrackerMap * Copyright (C) 2021-2022 Iván Ávalos , Henoch Ojeda * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ 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(mutableListOf(), this::itemAction) binding.infoLoading.root.visibility = View.VISIBLE } @DelicateCoroutinesApi private fun setupObservers() { Log.d("DevicesFragment", "setupObservers()") unitsViewModel.displayedUnits.observe(viewLifecycleOwner) { units -> Log.d("DevicesFragment", "Success $units") binding.infoLoading.root.visibility = View.GONE (binding.devicesList.adapter as DevicesAdapter).setData(units) } } 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) } } } }