diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/EditRoadtripMap.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/EditRoadtripMap.kt index e8e861d..b963a9d 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/EditRoadtripMap.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/EditRoadtripMap.kt @@ -6,39 +6,42 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import org.osmdroid.bonuspack.routing.OSRMRoadManager -import org.osmdroid.views.MapView +import org.osmdroid.util.BoundingBox +import org.osmdroid.util.GeoPoint import uca.baptistearthur.geocaching.model.RoadTripEntity -import uca.baptistearthur.geocaching.ui.overlay.AddMarkerOverlay import uca.baptistearthur.geocaching.ui.overlay.EditMarkerOverlay -import uca.baptistearthur.geocaching.ui.overlay.MarkerOverlay -import uca.baptistearthur.geocaching.ui.overlay.EditRoadtripOverlay +import kotlin.math.ln +import kotlin.math.roundToInt +import kotlin.math.sqrt -class EditRoadtripMap : Map() { - companion object{ - const val defaultZoomLevel = 10.0 - } +class EditRoadtripMap : Map() { var roadTrip: RoadTripEntity? = null set(value) { roadTrip?: value?.let { - val editMarkerOverlay = EditMarkerOverlay(OSRMRoadManager(context, userAgent), value) - editMarkerOverlay.addPlaces(value.places, map) - map.overlays.add(editMarkerOverlay); - map.controller.setCenter(value.places.first()) + addEditMarkerOverlay(value) + getMapParams(value).let{ + map.controller.setCenter(it.first) + map.controller.setZoom(it.second) + } field = value } } - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - Log.d("GeoMap", "CREATE EDIT MAP") - val view = super.onCreateView(inflater, container, savedInstanceState) - map.controller.setZoom(defaultZoomLevel) - return view + private fun addEditMarkerOverlay(roadTrip: RoadTripEntity){ + val editMarkerOverlay = EditMarkerOverlay(OSRMRoadManager(context, userAgent), roadTrip) + editMarkerOverlay.addPlaces(roadTrip.places, map) + map.overlays.add(editMarkerOverlay); + } + + private fun getMapParams(roadTrip: RoadTripEntity): Pair{ + val boundingBox = BoundingBox.fromGeoPoints(roadTrip.places) + val maxDistance = 7000000.0 + val logZoom = (defaultZoomLevel - minimumZoomLevel) * ln(boundingBox.diagonalLengthInMeters) / ln(maxDistance) + val zoomLevel = (defaultZoomLevel - logZoom).coerceIn(minimumZoomLevel, defaultZoomLevel) + return Pair(boundingBox.centerWithDateLine, zoomLevel) } } \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/EditMarkerOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/EditMarkerOverlay.kt index 5f0de1c..1fc004d 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/EditMarkerOverlay.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/EditMarkerOverlay.kt @@ -6,7 +6,7 @@ import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import uca.baptistearthur.geocaching.model.RoadTripEntity -class EditMarkerOverlay(roadManager: RoadManager, val roadTrip: RoadTripEntity) : MarkerOverlay(roadManager) { +class EditMarkerOverlay(roadManager: RoadManager, var roadTrip: RoadTripEntity) : MarkerOverlay(roadManager) { fun addPlaces(geopoints: Collection, mapView: MapView)= geopoints.forEach { diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/EditRoadtripOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/EditRoadtripOverlay.kt index 09dd4bd..f4c794f 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/EditRoadtripOverlay.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/EditRoadtripOverlay.kt @@ -1,6 +1,10 @@ package uca.baptistearthur.geocaching.ui.overlay +import android.app.AlertDialog import android.content.Context +import android.text.InputFilter +import android.util.Log +import android.widget.EditText import android.widget.Toast import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner @@ -15,6 +19,7 @@ import uca.baptistearthur.geocaching.model.Place import uca.baptistearthur.geocaching.model.RoadTripEntity import uca.baptistearthur.geocaching.viewModels.RoadTripViewModel import uca.baptistearthur.geocaching.viewModels.RoadTripViewModelFactory +import java.util.* class EditRoadtripOverlay(points: MutableCollection, val roadTripEntity: RoadTripEntity) : ConfirmationOverlay(points) { @@ -25,13 +30,14 @@ class EditRoadtripOverlay(points: MutableCollection, val roadTripEn RoadTripViewModel::class.java) } - override fun confirm(mapView: MapView) { - val places: MutableList = points.map { Place(it.position.latitude, it.position.longitude) }.toMutableList() + private fun onValidation(mapView: MapView, input: String) { + val places: MutableList = + points.map { Place(it.position.latitude, it.position.longitude) }.toMutableList() CoroutineScope(Dispatchers.Main).launch { - places.filter{it.address.displayName==="unknown"}.forEach{ it.initAddress() } + places.filter { it.address.displayName === "unknown" }.forEach { it.initAddress() } val newRoadTrip = RoadTripEntity( id = roadTripEntity.id, - name = roadTripEntity.name, + name = input, date = roadTripEntity.date, places = places ) @@ -42,7 +48,33 @@ class EditRoadtripOverlay(points: MutableCollection, val roadTripEn R.string.changesSaved, Toast.LENGTH_SHORT ).show() - } } + + override fun confirm(mapView: MapView) { + val input = EditText(mapView.context) + input.setText(roadTripEntity.name) + input.filters = arrayOf(InputFilter.LengthFilter(50)) + + val dialog = AlertDialog.Builder(mapView.context) + .setTitle(R.string.newRoadtripDialog) + .setView(input) + .setPositiveButton(R.string.confirm) { _, _ -> + val userInput = input.text.toString() + if (userInput.isNotBlank()) { + onValidation(mapView, input.text.toString()) + } else { + Toast.makeText( + mapView.context, + R.string.emptyTextError, + Toast.LENGTH_SHORT + ).show() + } + } + .setNegativeButton(R.string.cancel) { dialog, _ -> + dialog.cancel() + } + .create() + dialog.show() + } } \ No newline at end of file