diff --git a/app/src/googleplay/java/org/tasks/location/GoogleMapFragment.kt b/app/src/googleplay/java/org/tasks/location/GoogleMapFragment.kt index d2159a262..093e7d508 100644 --- a/app/src/googleplay/java/org/tasks/location/GoogleMapFragment.kt +++ b/app/src/googleplay/java/org/tasks/location/GoogleMapFragment.kt @@ -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) { diff --git a/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt b/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt index ee7364455..6153d501f 100644 --- a/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt +++ b/app/src/main/java/org/tasks/activities/PlaceSettingsActivity.kt @@ -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, + ) + } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/location/MapFragment.kt b/app/src/main/java/org/tasks/location/MapFragment.kt index 5e16ca760..d8d19ce44 100644 --- a/app/src/main/java/org/tasks/location/MapFragment.kt +++ b/app/src/main/java/org/tasks/location/MapFragment.kt @@ -16,6 +16,8 @@ interface MapFragment { fun showMyLocation() + fun showCircle(radius: Double, latitude: Double, longitude: Double) + fun onPause() fun onResume() diff --git a/app/src/main/java/org/tasks/location/MapPosition.kt b/app/src/main/java/org/tasks/location/MapPosition.kt index 9854add32..f572aa969 100644 --- a/app/src/main/java/org/tasks/location/MapPosition.kt +++ b/app/src/main/java/org/tasks/location/MapPosition.kt @@ -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 = object : Parcelable.Creator { override fun createFromParcel(source: Parcel) = MapPosition(source) diff --git a/app/src/main/java/org/tasks/location/OsmMapFragment.kt b/app/src/main/java/org/tasks/location/OsmMapFragment.kt index bfdd7de74..ca2befc74 100644 --- a/app/src/main/java/org/tasks/location/OsmMapFragment.kt +++ b/app/src/main/java/org/tasks/location/OsmMapFragment.kt @@ -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() diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b0526582b..e3d1f6132 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -147,6 +147,8 @@ @color/black_38 @color/black_12 @color/grey_300 + #2196f3 + #332196f3 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e11153c7..0ded813b6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -340,7 +340,7 @@ File %1$s contained %2$s.\n\n When overdue When due When started - Radius + Geofence radius %s m Tags Filters