From f6171f524e64966355fa64644a46939a35beb412 Mon Sep 17 00:00:00 2001 From: Isidro Henoch Date: Mon, 3 Jan 2022 15:15:50 -0600 Subject: Splits the MapFragment funcionality - Now there's MapFragment, which is the map and is responsible for displaying markers and focusing on a particular point. This functionality will be extended. - UnitMapFragment is the entity in charge of the subscriptions and converts UnitInformation entities to something MapFragment can handle. --- .../TrackerMap/android/map/UnitMapFragment.kt | 103 +++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt (limited to 'androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt') diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt new file mode 100644 index 0000000..7212a23 --- /dev/null +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt @@ -0,0 +1,103 @@ +package mx.trackermap.TrackerMap.android.map + +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 kotlinx.coroutines.DelicateCoroutinesApi +import mx.trackermap.TrackerMap.android.R +import mx.trackermap.TrackerMap.android.databinding.UnitMapFragmentBinding +import mx.trackermap.TrackerMap.android.units.UnitsViewModel +import mx.trackermap.TrackerMap.client.models.UnitInformation +import org.koin.androidx.viewmodel.ext.android.viewModel + +@DelicateCoroutinesApi +class UnitMapFragment : Fragment() { + + private val unitsViewModel: UnitsViewModel by viewModel() + + private var _binding: UnitMapFragmentBinding? = null + private val binding get() = _binding!! + private lateinit var unitsMapFragment: MapFragment + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = UnitMapFragmentBinding.inflate(inflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initializeMap() + setupObservers() + } + + private fun initializeMap() { + unitsMapFragment = childFragmentManager.findFragmentById(R.id.unitsMap) as MapFragment + } + + private fun setupObservers() { + Log.d("MapFragment", "setupObservers()") + + unitsViewModel.units.observe(viewLifecycleOwner) { units -> + Log.d("UnitMapFragment", "Available units: $units") + + unitsMapFragment.display(units.mapNotNull(this::unitToMarker).toTypedArray()) + } + + unitsViewModel.selectedUnit.observe(viewLifecycleOwner) { selectedUnit -> + Log.d("UnitMapFragment", "Selected Unit: $selectedUnit") + + binding.mapUnitCard.visibility = if (selectedUnit == null) View.GONE else View.VISIBLE + selectedUnit?.position?.let { position -> + if (position.latitude == null || position.longitude == null) { + return@let + } + + unitsMapFragment.focusOn(position.latitude!!, position.longitude!!) + } + } + } + + private fun unitToMarker(unit: UnitInformation): MapFragment.Marker? { + if (unit.position == null || unit.position!!.latitude == null || unit.position!!.longitude == null) { + return null + } + + return MapFragment.Marker( + unit.position!!.id!!, + unit.position!!.latitude!!, + unit.position!!.longitude!!, + when (unit.device.category?.lowercase()) { + "animal" -> MapFragment.MarkerType.ANIMAL + "bicycle" -> MapFragment.MarkerType.BICYCLE + "boat" -> MapFragment.MarkerType.BOAT + "bus" -> MapFragment.MarkerType.BUS + "car" -> MapFragment.MarkerType.CAR + "crane" -> MapFragment.MarkerType.CRANE + "helicopter" -> MapFragment.MarkerType.HELICOPTER + "motorcycle" -> MapFragment.MarkerType.MOTORCYCLE + "offroad" -> MapFragment.MarkerType.OFFROAD + "person" -> MapFragment.MarkerType.PERSON + "pickup" -> MapFragment.MarkerType.PICKUP + "plane" -> MapFragment.MarkerType.PLANE + "scooter" -> MapFragment.MarkerType.SCOOTER + "ship" -> MapFragment.MarkerType.SHIP + "tractor" -> MapFragment.MarkerType.TRACTOR + "train" -> MapFragment.MarkerType.TRAIN + "tram" -> MapFragment.MarkerType.TRAM + "trolleybus" -> MapFragment.MarkerType.TROLLEYBUS + "truck" -> MapFragment.MarkerType.TRUCK + "van" -> MapFragment.MarkerType.VAN + else -> MapFragment.MarkerType.DEFAULT + } + ) + } + +} \ No newline at end of file -- cgit v1.2.3