aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt36
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt13
2 files changed, 42 insertions, 7 deletions
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
index 768c0f0..ca59266 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt
@@ -9,6 +9,7 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import androidx.fragment.app.viewModels
+import com.mousebird.maply.Point2d
import kotlin.time.ExperimentalTime
import kotlinx.coroutines.DelicateCoroutinesApi
import mx.trackermap.TrackerMap.android.R
@@ -30,7 +31,7 @@ class UnitMapFragment : Fragment() {
private val binding get() = _binding!!
private lateinit var mapFragment: MapWrapperFragment
- private var shouldCenter = true
+ private var shouldCenterMap = true
override fun onCreateView(
inflater: LayoutInflater,
@@ -60,7 +61,7 @@ class UnitMapFragment : Fragment() {
}
private fun initializeMap() {
- shouldCenter = true
+ shouldCenterMap = true
mapFragment = MapWrapperFragment.newInstance(
overlayMarginTop = resources.getDimensionPixelSize(R.dimen.nav_height)
)
@@ -78,10 +79,12 @@ class UnitMapFragment : Fragment() {
mapFragment.display(
units.toTypedArray(),
isReport = false,
- center = shouldCenter && unitsViewModel.selectedUnit.value == null
+ center = shouldCenterMap
+ && unitsViewModel.selectedUnit.value == null
+ && unitsViewModel.camera.value == null
)
if (units.isNotEmpty()) {
- shouldCenter = false
+ shouldCenterMap = false
}
}
@@ -91,7 +94,8 @@ class UnitMapFragment : Fragment() {
binding.mapUnitCard.visibility = if (selectedUnit == null) View.GONE else View.VISIBLE
selectedUnit?.let { unit ->
- if (unit.position == null || unit.position!!.latitude == null || unit.position!!.longitude == null) {
+ if (unit.position == null || unit.position?.latitude == null || unit.position?.longitude == null) {
+ binding.mapUnitCard.visibility = View.GONE
return@let
}
@@ -107,7 +111,14 @@ class UnitMapFragment : Fragment() {
), binding.mapUnitCard.context, unit, this::itemAction
)
- mapFragment.focusOn(unit.position!!.latitude!!, unit.position!!.longitude!!)
+ unitsViewModel.moveCamera(
+ UnitsViewModel.Camera(
+ point = Point2d(
+ unit.position!!.longitude!!, unit.position!!.latitude!!
+ ),
+ animated = true
+ )
+ )
}
}
@@ -115,13 +126,24 @@ class UnitMapFragment : Fragment() {
Log.d("UnitMapFragment", "Loading layer!")
mapFragment.updateLayer(type)
unitsViewModel.selectedUnit.value?.let {
- mapFragment.focusOn(it.position!!.latitude!!, it.position!!.longitude!!)
+ unitsViewModel.moveCamera(
+ UnitsViewModel.Camera(
+ point = Point2d(
+ it.position!!.longitude!!, it.position!!.latitude!!
+ ),
+ animated = false
+ )
+ )
}
}
unitsViewModel.geofences.observe(viewLifecycleOwner) { geofences ->
mapFragment.display(geofences.values.toTypedArray())
}
+
+ unitsViewModel.camera.observe(viewLifecycleOwner) { camera ->
+ mapFragment.focusOn(camera.point.y, camera.point.x)
+ }
}
private fun removeObservers() {
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt
index efa5781..ee6fa98 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt
@@ -2,6 +2,7 @@ package mx.trackermap.TrackerMap.android.units
import android.util.Log
import androidx.lifecycle.*
+import com.mousebird.maply.Point2d
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
@@ -14,6 +15,7 @@ import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import kotlin.time.ExperimentalTime
+
@DelicateCoroutinesApi
@ExperimentalTime
class UnitsViewModel(
@@ -24,6 +26,11 @@ class UnitsViewModel(
MAP, LIST
}
+ data class Camera (
+ val point: Point2d,
+ val animated: Boolean,
+ )
+
private val unitsController: UnitsController by inject()
private val geofenceController: GeofencesController by inject()
@@ -33,6 +40,7 @@ class UnitsViewModel(
private var _selectedUnit = MutableLiveData<UnitInformation?>()
private var _mapLayerType = MutableLiveData<MapLayer.Type>()
private var _geofences = MutableLiveData<Map<Int, Geofence>>()
+ private val _camera = MutableLiveData<Camera>()
val searchQuery: LiveData<String> get() = _searchQuery
val unitsDisplayMode: LiveData<UnitsDisplayMode> get() = _unitsDisplayMode
@@ -40,6 +48,7 @@ class UnitsViewModel(
val selectedUnit: LiveData<UnitInformation?> get() = _selectedUnit
val mapLayerType: LiveData<MapLayer.Type> get() = _mapLayerType
val geofences: LiveData<Map<Int, Geofence>> get() = _geofences
+ val camera: LiveData<Camera> get() = _camera
init {
Log.d("UnitsViewModel", "Initializing Units View Model")
@@ -106,4 +115,8 @@ class UnitsViewModel(
fun search(query: String) {
unitsController.search(query)
}
+
+ fun moveCamera(point: Camera) {
+ _camera.postValue(point)
+ }
} \ No newline at end of file