diff --git a/app/src/main/java/com/geeksville/mesh/model/map/CirclePlottingOverlay.kt b/app/src/main/java/com/geeksville/mesh/model/map/CirclePlottingOverlay.kt new file mode 100644 index 00000000..eb7c3696 --- /dev/null +++ b/app/src/main/java/com/geeksville/mesh/model/map/CirclePlottingOverlay.kt @@ -0,0 +1,42 @@ +package com.geeksville.mesh.model.map + +import android.util.Log +import android.view.MotionEvent +import org.osmdroid.api.IMapView +import org.osmdroid.config.Configuration +import org.osmdroid.util.GeoPoint +import org.osmdroid.views.MapView +import org.osmdroid.views.overlay.Overlay +import org.osmdroid.views.overlay.Polygon + + +class CirclePlottingOverlay(var distanceKm: Int) : Overlay() { + override fun onLongPress(e: MotionEvent, mapView: MapView): Boolean { + if (Configuration.getInstance().isDebugMapView) { + Log.d(IMapView.LOGTAG, "CirclePlottingOverlay onLongPress") + } + val pt = mapView.projection.fromPixels(e.x.toInt(), e.y.toInt(), null) as GeoPoint + /* + * Notehttps://github.com/osmdroid/osmdroid/pull/722 + * for more information and the discussion associated with this. + */ + + //just in case the point is off the map, let's fix the coordinates + if (pt.longitude < -180) pt.longitude = pt.longitude + 360 + if (pt.longitude > 180) pt.longitude = pt.longitude - 360 + //latitude is a bit harder. see https://en.wikipedia.org/wiki/Mercator_projection + if (pt.latitude > 85.05112877980659) pt.latitude = 85.05112877980659 + if (pt.latitude < -85.05112877980659) pt.latitude = -85.05112877980659 + val circle: List = Polygon.pointsAsCircle(pt, distanceKm.toDouble()) + val p = Polygon(mapView) + p.points = circle + p.title = "A circle" + mapView.overlayManager.add(p) + mapView.invalidate() + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/geeksville/mesh/model/CustomTileSource.kt b/app/src/main/java/com/geeksville/mesh/model/map/CustomTileSource.kt similarity index 98% rename from app/src/main/java/com/geeksville/mesh/model/CustomTileSource.kt rename to app/src/main/java/com/geeksville/mesh/model/map/CustomTileSource.kt index 7e60c9a7..a537229e 100644 --- a/app/src/main/java/com/geeksville/mesh/model/CustomTileSource.kt +++ b/app/src/main/java/com/geeksville/mesh/model/map/CustomTileSource.kt @@ -1,11 +1,10 @@ -package com.geeksville.mesh.model +package com.geeksville.mesh.model.map import org.osmdroid.tileprovider.tilesource.ITileSource import org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase import org.osmdroid.tileprovider.tilesource.TileSourceFactory import org.osmdroid.tileprovider.tilesource.TileSourcePolicy import org.osmdroid.util.MapTileIndex -import org.osmdroid.wms.WMSTileSource class CustomTileSource { @@ -153,7 +152,6 @@ class CustomTileSource { USGS_TOPO, USGS_SAT, ESRI_IMAGERY, - NOAA_RADAR ) diff --git a/app/src/main/java/com/geeksville/mesh/model/NOAAWmsTileSource.kt b/app/src/main/java/com/geeksville/mesh/model/map/NOAAWmsTileSource.kt similarity index 99% rename from app/src/main/java/com/geeksville/mesh/model/NOAAWmsTileSource.kt rename to app/src/main/java/com/geeksville/mesh/model/map/NOAAWmsTileSource.kt index da5f65b5..434a929e 100644 --- a/app/src/main/java/com/geeksville/mesh/model/NOAAWmsTileSource.kt +++ b/app/src/main/java/com/geeksville/mesh/model/map/NOAAWmsTileSource.kt @@ -1,4 +1,4 @@ -package com.geeksville.mesh.model +package com.geeksville.mesh.model.map import android.content.res.Resources import android.util.Log diff --git a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt index 3aa193fa..fa068d4c 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt @@ -22,8 +22,9 @@ import com.geeksville.mesh.R import com.geeksville.mesh.android.Logging import com.geeksville.mesh.database.entity.Packet import com.geeksville.mesh.databinding.MapViewBinding -import com.geeksville.mesh.model.CustomTileSource import com.geeksville.mesh.model.UIViewModel +import com.geeksville.mesh.model.map.CirclePlottingOverlay +import com.geeksville.mesh.model.map.CustomTileSource import com.geeksville.mesh.util.formatAgo import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.FloatingActionButton @@ -51,7 +52,7 @@ import kotlin.math.pow @AndroidEntryPoint class MapFragment : ScreenFragment("Map"), Logging, View.OnClickListener, OnSeekBarChangeListener, - TextWatcher { + TextWatcher, View.OnLongClickListener { private lateinit var binding: MapViewBinding private lateinit var map: MapView @@ -127,6 +128,9 @@ class MapFragment : ScreenFragment("Map"), Logging, View.OnClickListener, OnSeek drawOverlays() } zoomToNodes(mapController) + map.setOnLongClickListener(this) + val plotter = CirclePlottingOverlay(100) + map.overlayManager.add(plotter) } downloadBtn.setOnClickListener(this) } @@ -499,20 +503,6 @@ class MapFragment : ScreenFragment("Map"), Logging, View.OnClickListener, OnSeek defaultMinZoom // sets the minimum zoom level (the furthest out you can zoom) map.setMultiTouchControls(true) // Sets gesture controls to true. map.zoomController.setVisibility(CustomZoomButtonsController.Visibility.NEVER) // Disables default +/- button for zooming - map.addMapListener(onMapLongPress()) - } - } - - private fun onMapLongPress(): MapListener { - return object : MapListener { - override fun onScroll(event: ScrollEvent?): Boolean { - return true - } - - override fun onZoom(event: ZoomEvent?): Boolean { - return true - } - } } @@ -568,6 +558,30 @@ class MapFragment : ScreenFragment("Map"), Logging, View.OnClickListener, OnSeek super.onDestroyView() map.onDetach() } + override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) { + updateEstimate(false) + } + + override fun onStartTrackingTouch(p0: SeekBar?) { + } + + override fun onStopTrackingTouch(p0: SeekBar?) { + } + + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + } + + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + updateEstimate(false) + } + + override fun afterTextChanged(p0: Editable?) { + } + + override fun onLongClick(p0: View?): Boolean { + Log.d("MapFragment", "Long pressed map") + return true + } private inner class MarkerWithLabel(mapView: MapView?, label: String) : Marker(mapView) { val mLabel = label @@ -607,26 +621,6 @@ class MapFragment : ScreenFragment("Map"), Logging, View.OnClickListener, OnSeek c.drawText(mLabel, (p.x - 0f), (p.y - 110f), textPaint) } } - - override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) { - updateEstimate(false) - } - - override fun onStartTrackingTouch(p0: SeekBar?) { - } - - override fun onStopTrackingTouch(p0: SeekBar?) { - } - - override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { - } - - override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { - updateEstimate(false) - } - - override fun afterTextChanged(p0: Editable?) { - } } diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 742af2ee..38fea1c7 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -91,6 +91,5 @@ USGS TOPO USGS Satellite ESRI World Overview - NOAA GOES Radar \ No newline at end of file