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.* import androidx.core.widget.TextViewCompat import androidx.fragment.app.Fragment 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(this) { 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 = Button(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) } } }