diff options
Diffstat (limited to 'androidApp/src/main')
4 files changed, 54 insertions, 9 deletions
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt index 87fb44a..37956c1 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt @@ -344,7 +344,7 @@ open class MapFragment : GlobeMapFragment() { fun focusOn( latitude: Double, longitude: Double, - height: Double = 0.00001, + height: Double = 0.0000264, animated: Boolean = true ) { val lat = latitude * Math.PI / 180 diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt index 01587ae..c8ef688 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt @@ -130,7 +130,7 @@ class MapWrapperFragment: Fragment() { fun focusOn( latitude: Double, longitude: Double, - height: Double = 0.00001, + height: Double = 0.0000264, animated: Boolean = true ) { Log.d("MapWrapperFragment", "Focusing on $latitude, $longitude") 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..e64afd3 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 } } @@ -90,8 +93,13 @@ class UnitMapFragment : Fragment() { binding.mapUnitCard.visibility = if (selectedUnit == null) View.GONE else View.VISIBLE + if (selectedUnit == null) { + unitsViewModel.clearCamera() + } + 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 +115,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 +130,26 @@ 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 -> + camera?.let { + 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..cb30725 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,12 @@ class UnitsViewModel( fun search(query: String) { unitsController.search(query) } + + fun moveCamera(point: Camera) { + _camera.postValue(point) + } + + fun clearCamera() { + _camera.postValue(null) + } }
\ No newline at end of file |