Add geofence circle to place settings

pull/1967/head
Alex Baker 2 years ago
parent 336279ee63
commit 68b91ed2c7

@ -12,7 +12,6 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.R
import org.tasks.data.Place
import org.tasks.location.MapFragment.MapFragmentCallback
import java.util.*
import javax.inject.Inject
class GoogleMapFragment @Inject constructor(
@ -22,6 +21,7 @@ class GoogleMapFragment @Inject constructor(
private lateinit var callback: MapFragmentCallback
private var dark = false
private var map: GoogleMap? = null
private var circle: Circle? = null
override fun init(activity: AppCompatActivity, callback: MapFragmentCallback, dark: Boolean) {
this.callback = callback
@ -75,6 +75,17 @@ class GoogleMapFragment @Inject constructor(
map?.isMyLocationEnabled = true
}
override fun showCircle(radius: Double, latitude: Double, longitude: Double) {
circle?.remove()
circle = map?.addCircle(
CircleOptions()
.radius(radius)
.center(LatLng(latitude, longitude))
.strokeColor(context.getColor(R.color.map_circle_stroke))
.fillColor(context.getColor(R.color.map_circle_fill))
)
}
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
if (dark) {

@ -25,7 +25,8 @@ import javax.inject.Inject
import kotlin.math.roundToInt
@AndroidEntryPoint
class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmentCallback {
class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmentCallback,
Slider.OnChangeListener {
companion object {
const val EXTRA_PLACE = "extra_place"
@ -95,6 +96,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
haloRadius = 0
value = (place.radius / STEP * STEP).roundToInt().toFloat()
}
slider.addOnChangeListener(this)
it.root
}
@ -125,7 +127,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
override val isNew: Boolean
get() = false
override val toolbarTitle: String?
override val toolbarTitle: String
get() = place.address ?: place.displayName
override suspend fun delete() {
@ -141,7 +143,27 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
map.setMarkers(listOf(place))
map.disableGestures()
map.movePosition(place.mapPosition, false)
updateGeofenceCircle()
}
override fun onPlaceSelected(place: Place) {}
override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
updateGeofenceCircle()
}
private fun updateGeofenceCircle() {
val radius = slider.value.toDouble()
val zoom = when (radius) {
in 0f..300f -> 15f
in 300f..500f -> 14.5f
in 500f..700f -> 14.25f
in 700f..900f -> 14f
else -> 13.75f
}
map.showCircle(radius, place.latitude, place.longitude)
map.movePosition(
mapPosition = place.mapPosition.copy(zoom = zoom),
animate = true,
)
}
}

@ -16,6 +16,8 @@ interface MapFragment {
fun showMyLocation()
fun showCircle(radius: Double, latitude: Double, longitude: Double)
fun onPause()
fun onResume()

@ -3,23 +3,16 @@ package org.tasks.location
import android.os.Parcel
import android.os.Parcelable
class MapPosition : Parcelable {
val latitude: Double
val longitude: Double
val zoom: Float
@JvmOverloads
constructor(latitude: Double, longitude: Double, zoom: Float = 15.0f) {
this.latitude = latitude
this.longitude = longitude
this.zoom = zoom
}
private constructor(parcel: Parcel) {
latitude = parcel.readDouble()
longitude = parcel.readDouble()
zoom = parcel.readFloat()
}
data class MapPosition(
val latitude: Double,
val longitude: Double,
val zoom: Float = 15.0f,
) : Parcelable {
private constructor(parcel: Parcel) : this(
latitude = parcel.readDouble(),
longitude = parcel.readDouble(),
zoom = parcel.readFloat(),
)
override fun describeContents() = 0
@ -29,26 +22,6 @@ class MapPosition : Parcelable {
dest.writeFloat(zoom)
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is MapPosition) return false
if (latitude != other.latitude) return false
if (longitude != other.longitude) return false
if (zoom != other.zoom) return false
return true
}
override fun hashCode(): Int {
var result = latitude.hashCode()
result = 31 * result + longitude.hashCode()
result = 31 * result + zoom.hashCode()
return result
}
override fun toString() = "MapPosition(latitude=$latitude, longitude=$longitude, zoom=$zoom)"
companion object {
@JvmField val CREATOR: Parcelable.Creator<MapPosition> = object : Parcelable.Creator<MapPosition> {
override fun createFromParcel(source: Parcel) = MapPosition(source)

@ -14,6 +14,7 @@ import org.osmdroid.views.CustomZoomButtonsController
import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.CopyrightOverlay
import org.osmdroid.views.overlay.Marker
import org.osmdroid.views.overlay.Polygon
import org.osmdroid.views.overlay.TilesOverlay
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay
@ -28,6 +29,7 @@ class OsmMapFragment @Inject constructor(
private lateinit var callback: MapFragmentCallback
private lateinit var map: MapView
private var locationOverlay: MyLocationNewOverlay? = null
private var circle: Polygon? = null
override fun init(activity: AppCompatActivity, callback: MapFragmentCallback, dark: Boolean) {
this.callback = callback
@ -94,6 +96,17 @@ class OsmMapFragment @Inject constructor(
map.overlays.add(locationOverlay)
}
override fun showCircle(radius: Double, latitude: Double, longitude: Double) {
circle?.let { map.overlays.remove(it) }
circle = Polygon(map).apply {
points = Polygon.pointsAsCircle(GeoPoint(latitude, longitude), radius)
fillPaint.color = context.getColor(R.color.map_circle_fill)
outlinePaint.color = context.getColor(R.color.map_circle_stroke)
map.overlays.add(0, this)
}
map.invalidate()
}
override fun onPause() {
locationOverlay?.disableMyLocation()
map.onPause()

@ -147,6 +147,8 @@
<color name="text_tertiary">@color/black_38</color>
<color name="divider">@color/black_12</color>
<color name="default_chip_background">@color/grey_300</color>
<color name="map_circle_stroke">#2196f3</color>
<color name="map_circle_fill">#332196f3</color>
</resources>

@ -340,7 +340,7 @@ File %1$s contained %2$s.\n\n
<string name="when_overdue">When overdue</string>
<string name="when_due">When due</string>
<string name="when_started">When started</string>
<string name="geofence_radius">Radius</string>
<string name="geofence_radius">Geofence radius</string>
<string name="location_radius_meters">%s m</string>
<string name="tags">Tags</string>
<string name="filters">Filters</string>

Loading…
Cancel
Save