package mx.trackermap.TrackerMap.android.details.information import android.content.Intent import android.net.Uri import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.TextView import androidx.core.widget.TextViewCompat import androidx.fragment.app.Fragment import com.google.android.material.button.MaterialButton import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.android.databinding.UnitDetailsInformationBinding import mx.trackermap.TrackerMap.android.details.UnitDetailsAdapter import mx.trackermap.TrackerMap.client.models.UnitInformation import mx.trackermap.TrackerMap.utils.Formatter import mx.trackermap.TrackerMap.utils.SpeedUnit import org.koin.androidx.viewmodel.ext.android.viewModel @DelicateCoroutinesApi class UnitInformationFragment : Fragment() { private var _binding: UnitDetailsInformationBinding? = null private val binding get() = _binding!! private val unitInformationViewModel: UnitInformationViewModel by viewModel() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = UnitDetailsInformationBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupObservers() fetchInformation() } override fun onDestroyView() { super.onDestroyView() _binding = null } private fun setupObservers() { unitInformationViewModel.unit.observe(viewLifecycleOwner) { unitInformation -> Log.d("UnitInformationFragment", "Unit Information Fetched - $unitInformation") unitInformation?.let { displayInformation(it) } } } private fun fetchInformation() { val id = arguments?.getInt(UnitDetailsAdapter.DEVICE_ID_ARG) unitInformationViewModel.fetchUnit(id ?: 0) } private fun displayInformation(unit: UnitInformation) { val context = context!! val details: MutableList> = mutableListOf() unit.device.contact?.let { contact -> details.add(getString(R.string.unit_info_contact) to contact) } unit.position?.fixTime?.let { fixTime -> details.add(getString(R.string.unit_info_datetime) to Formatter.formatDate(fixTime)) } unit.position?.latitude?.let { latitude -> details.add(getString(R.string.unit_info_latitude) to "$latitude") } unit.position?.longitude?.let { longitude -> details.add(getString(R.string.unit_info_longitude) to "$longitude") } unit.position?.speed?.let { speed -> details.add( getString(R.string.unit_info_speed) to Formatter.formatSpeed( speed, SpeedUnit.KMH ) ) } unit.position?.address?.let { address -> details.add(getString(R.string.unit_info_address) to address) } unit.position?.protocol?.let { protocol -> details.add(getString(R.string.unit_info_protocol) to protocol) } binding.nameDetail.text = unit.device.name details.forEach { entry -> val layout = LinearLayout(context) layout.orientation = LinearLayout.VERTICAL val params = LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT ) params.setMargins(0, 0, 0, resources.getDimensionPixelSize(R.dimen.padding)) layout.layoutParams = params val text1 = TextView(context) TextViewCompat.setTextAppearance(text1, R.style.TextAppearance_AppCompat_Body2) text1.text = entry.first val text2 = TextView(context) text2.text = entry.second layout.addView(text1) layout.addView(text2) binding.detailsLayout.addView(layout) } if (unit.position?.latitude != null && unit.position?.longitude != null) { val mapButton = MaterialButton(context) mapButton.text = getString(R.string.unit_info_map_button) mapButton.setOnClickListener { val latitude = unit.position!!.latitude val longitude = unit.position!!.longitude val url = getString(R.string.maps_url_template, latitude, longitude) startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) } binding.detailsLayout.addView(mapButton) } } }