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.R
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.location.MapFragment.MapFragmentCallback import org.tasks.location.MapFragment.MapFragmentCallback
import java.util.*
import javax.inject.Inject import javax.inject.Inject
class GoogleMapFragment @Inject constructor( class GoogleMapFragment @Inject constructor(
@ -22,6 +21,7 @@ class GoogleMapFragment @Inject constructor(
private lateinit var callback: MapFragmentCallback private lateinit var callback: MapFragmentCallback
private var dark = false private var dark = false
private var map: GoogleMap? = null private var map: GoogleMap? = null
private var circle: Circle? = null
override fun init(activity: AppCompatActivity, callback: MapFragmentCallback, dark: Boolean) { override fun init(activity: AppCompatActivity, callback: MapFragmentCallback, dark: Boolean) {
this.callback = callback this.callback = callback
@ -75,6 +75,17 @@ class GoogleMapFragment @Inject constructor(
map?.isMyLocationEnabled = true 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) { override fun onMapReady(googleMap: GoogleMap) {
map = googleMap map = googleMap
if (dark) { if (dark) {

@ -25,7 +25,8 @@ import javax.inject.Inject
import kotlin.math.roundToInt import kotlin.math.roundToInt
@AndroidEntryPoint @AndroidEntryPoint
class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmentCallback { class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmentCallback,
Slider.OnChangeListener {
companion object { companion object {
const val EXTRA_PLACE = "extra_place" const val EXTRA_PLACE = "extra_place"
@ -95,6 +96,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
haloRadius = 0 haloRadius = 0
value = (place.radius / STEP * STEP).roundToInt().toFloat() value = (place.radius / STEP * STEP).roundToInt().toFloat()
} }
slider.addOnChangeListener(this)
it.root it.root
} }
@ -125,7 +127,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
override val isNew: Boolean override val isNew: Boolean
get() = false get() = false
override val toolbarTitle: String? override val toolbarTitle: String
get() = place.address ?: place.displayName get() = place.address ?: place.displayName
override suspend fun delete() { override suspend fun delete() {
@ -141,7 +143,27 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
map.setMarkers(listOf(place)) map.setMarkers(listOf(place))
map.disableGestures() map.disableGestures()
map.movePosition(place.mapPosition, false) map.movePosition(place.mapPosition, false)
updateGeofenceCircle()
} }
override fun onPlaceSelected(place: Place) {} 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 showMyLocation()
fun showCircle(radius: Double, latitude: Double, longitude: Double)
fun onPause() fun onPause()
fun onResume() fun onResume()

@ -3,23 +3,16 @@ package org.tasks.location
import android.os.Parcel import android.os.Parcel
import android.os.Parcelable import android.os.Parcelable
class MapPosition : Parcelable { data class MapPosition(
val latitude: Double val latitude: Double,
val longitude: Double val longitude: Double,
val zoom: Float val zoom: Float = 15.0f,
) : Parcelable {
@JvmOverloads private constructor(parcel: Parcel) : this(
constructor(latitude: Double, longitude: Double, zoom: Float = 15.0f) { latitude = parcel.readDouble(),
this.latitude = latitude longitude = parcel.readDouble(),
this.longitude = longitude zoom = parcel.readFloat(),
this.zoom = zoom )
}
private constructor(parcel: Parcel) {
latitude = parcel.readDouble()
longitude = parcel.readDouble()
zoom = parcel.readFloat()
}
override fun describeContents() = 0 override fun describeContents() = 0
@ -29,26 +22,6 @@ class MapPosition : Parcelable {
dest.writeFloat(zoom) 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 { companion object {
@JvmField val CREATOR: Parcelable.Creator<MapPosition> = object : Parcelable.Creator<MapPosition> { @JvmField val CREATOR: Parcelable.Creator<MapPosition> = object : Parcelable.Creator<MapPosition> {
override fun createFromParcel(source: Parcel) = MapPosition(source) 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.MapView
import org.osmdroid.views.overlay.CopyrightOverlay import org.osmdroid.views.overlay.CopyrightOverlay
import org.osmdroid.views.overlay.Marker import org.osmdroid.views.overlay.Marker
import org.osmdroid.views.overlay.Polygon
import org.osmdroid.views.overlay.TilesOverlay import org.osmdroid.views.overlay.TilesOverlay
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay
@ -28,6 +29,7 @@ class OsmMapFragment @Inject constructor(
private lateinit var callback: MapFragmentCallback private lateinit var callback: MapFragmentCallback
private lateinit var map: MapView private lateinit var map: MapView
private var locationOverlay: MyLocationNewOverlay? = null private var locationOverlay: MyLocationNewOverlay? = null
private var circle: Polygon? = null
override fun init(activity: AppCompatActivity, callback: MapFragmentCallback, dark: Boolean) { override fun init(activity: AppCompatActivity, callback: MapFragmentCallback, dark: Boolean) {
this.callback = callback this.callback = callback
@ -94,6 +96,17 @@ class OsmMapFragment @Inject constructor(
map.overlays.add(locationOverlay) 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() { override fun onPause() {
locationOverlay?.disableMyLocation() locationOverlay?.disableMyLocation()
map.onPause() map.onPause()

@ -147,6 +147,8 @@
<color name="text_tertiary">@color/black_38</color> <color name="text_tertiary">@color/black_38</color>
<color name="divider">@color/black_12</color> <color name="divider">@color/black_12</color>
<color name="default_chip_background">@color/grey_300</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> </resources>

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

Loading…
Cancel
Save