Improving edition map

master
Arthur VALIN 2 years ago
parent d2f6389123
commit 4b4f1de6b7

@ -6,39 +6,42 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import org.osmdroid.bonuspack.routing.OSRMRoadManager 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.model.RoadTripEntity
import uca.baptistearthur.geocaching.ui.overlay.AddMarkerOverlay
import uca.baptistearthur.geocaching.ui.overlay.EditMarkerOverlay import uca.baptistearthur.geocaching.ui.overlay.EditMarkerOverlay
import uca.baptistearthur.geocaching.ui.overlay.MarkerOverlay import kotlin.math.ln
import uca.baptistearthur.geocaching.ui.overlay.EditRoadtripOverlay import kotlin.math.roundToInt
import kotlin.math.sqrt
class EditRoadtripMap : Map() {
companion object{ class EditRoadtripMap : Map() {
const val defaultZoomLevel = 10.0
}
var roadTrip: RoadTripEntity? = null var roadTrip: RoadTripEntity? = null
set(value) { set(value) {
roadTrip?: roadTrip?:
value?.let { value?.let {
val editMarkerOverlay = EditMarkerOverlay(OSRMRoadManager(context, userAgent), value) addEditMarkerOverlay(value)
editMarkerOverlay.addPlaces(value.places, map) getMapParams(value).let{
map.overlays.add(editMarkerOverlay); map.controller.setCenter(it.first)
map.controller.setCenter(value.places.first()) map.controller.setZoom(it.second)
}
field = value field = value
} }
} }
override fun onCreateView( private fun addEditMarkerOverlay(roadTrip: RoadTripEntity){
inflater: LayoutInflater, container: ViewGroup?, val editMarkerOverlay = EditMarkerOverlay(OSRMRoadManager(context, userAgent), roadTrip)
savedInstanceState: Bundle? editMarkerOverlay.addPlaces(roadTrip.places, map)
): View? { map.overlays.add(editMarkerOverlay);
Log.d("GeoMap", "CREATE EDIT MAP") }
val view = super.onCreateView(inflater, container, savedInstanceState)
map.controller.setZoom(defaultZoomLevel) private fun getMapParams(roadTrip: RoadTripEntity): Pair<GeoPoint, Double>{
return view 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)
} }
} }

@ -6,7 +6,7 @@ import org.osmdroid.util.GeoPoint
import org.osmdroid.views.MapView import org.osmdroid.views.MapView
import uca.baptistearthur.geocaching.model.RoadTripEntity import uca.baptistearthur.geocaching.model.RoadTripEntity
class EditMarkerOverlay(roadManager: RoadManager, val roadTrip: RoadTripEntity) : MarkerOverlay<EditRoadtripOverlay>(roadManager) { class EditMarkerOverlay(roadManager: RoadManager, var roadTrip: RoadTripEntity) : MarkerOverlay<EditRoadtripOverlay>(roadManager) {
fun addPlaces(geopoints: Collection<GeoPoint>, mapView: MapView)= fun addPlaces(geopoints: Collection<GeoPoint>, mapView: MapView)=
geopoints.forEach { geopoints.forEach {

@ -1,6 +1,10 @@
package uca.baptistearthur.geocaching.ui.overlay package uca.baptistearthur.geocaching.ui.overlay
import android.app.AlertDialog
import android.content.Context import android.content.Context
import android.text.InputFilter
import android.util.Log
import android.widget.EditText
import android.widget.Toast import android.widget.Toast
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelStoreOwner import androidx.lifecycle.ViewModelStoreOwner
@ -15,6 +19,7 @@ import uca.baptistearthur.geocaching.model.Place
import uca.baptistearthur.geocaching.model.RoadTripEntity import uca.baptistearthur.geocaching.model.RoadTripEntity
import uca.baptistearthur.geocaching.viewModels.RoadTripViewModel import uca.baptistearthur.geocaching.viewModels.RoadTripViewModel
import uca.baptistearthur.geocaching.viewModels.RoadTripViewModelFactory import uca.baptistearthur.geocaching.viewModels.RoadTripViewModelFactory
import java.util.*
class EditRoadtripOverlay(points: MutableCollection<PlaceMarker>, val roadTripEntity: RoadTripEntity) : ConfirmationOverlay(points) { class EditRoadtripOverlay(points: MutableCollection<PlaceMarker>, val roadTripEntity: RoadTripEntity) : ConfirmationOverlay(points) {
@ -25,13 +30,14 @@ class EditRoadtripOverlay(points: MutableCollection<PlaceMarker>, val roadTripEn
RoadTripViewModel::class.java) RoadTripViewModel::class.java)
} }
override fun confirm(mapView: MapView) { private fun onValidation(mapView: MapView, input: String) {
val places: MutableList<Place> = points.map { Place(it.position.latitude, it.position.longitude) }.toMutableList() val places: MutableList<Place> =
points.map { Place(it.position.latitude, it.position.longitude) }.toMutableList()
CoroutineScope(Dispatchers.Main).launch { 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( val newRoadTrip = RoadTripEntity(
id = roadTripEntity.id, id = roadTripEntity.id,
name = roadTripEntity.name, name = input,
date = roadTripEntity.date, date = roadTripEntity.date,
places = places places = places
) )
@ -42,7 +48,33 @@ class EditRoadtripOverlay(points: MutableCollection<PlaceMarker>, val roadTripEn
R.string.changesSaved, R.string.changesSaved,
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
}
}
override fun confirm(mapView: MapView) {
val input = EditText(mapView.context)
input.setText(roadTripEntity.name)
input.filters = arrayOf<InputFilter>(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()
} }
} }
Loading…
Cancel
Save