diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/requests/authenticated/AuthenticatedPostRequest.kt b/app/src/main/java/com/danilafe/fencelessgrazing/requests/authenticated/AuthenticatedPostRequest.kt index 6a81def..a9c739b 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/requests/authenticated/AuthenticatedPostRequest.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/requests/authenticated/AuthenticatedPostRequest.kt @@ -7,6 +7,17 @@ import com.google.gson.Gson import com.google.gson.JsonObject import org.json.JSONObject +/** + * General POST request aimed at a protected endpoint of the API. The token can be retrieved + * via a [LoginRequest], or, if you've made it past the login screen, via Shared Preferences. + * + * @param value the value to send as JSON to the API. + * @param baseUrl the base URL of the API. + * @param apiEndpoint the API endpoint to send the request to. + * @param token the token to use to authenticate with the API. + * @param listener the listener to be called when a response is received. + * @param error the error handler to be called if a request fails. + */ open class AuthenticatedPostRequest( private val value: T, baseUrl: String, diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/requests/authenticated/SetBoundaryRequest.kt b/app/src/main/java/com/danilafe/fencelessgrazing/requests/authenticated/SetBoundaryRequest.kt index 301820d..a8e61bf 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/requests/authenticated/SetBoundaryRequest.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/requests/authenticated/SetBoundaryRequest.kt @@ -3,6 +3,18 @@ package com.danilafe.fencelessgrazing.requests.authenticated import com.android.volley.Response import com.danilafe.fencelessgrazing.model.CollarPos +/** + * Request to the API's `/collar//boundary/set` endpoint, used to update a collar's + * valid grazing area. Note that although this request takes an arbitrary number of points, + * the collar itself only supports at most 10 vertices. + * + * @param baseUrl the base URl of the API. + * @param token the API token used for authentication. + * @param identifier the collar whose boundary is being set. + * @param coordinates the list of coordinates representing, in order, the new grazing boundary's vertices. + * @param listener the listener to be called when an OK response is received. + * @param error the error listener. + */ class SetBoundaryRequest( baseUrl: String, token: String, diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/ui/activities/BoundaryEditorActivity.kt b/app/src/main/java/com/danilafe/fencelessgrazing/ui/activities/BoundaryEditorActivity.kt index 4043ab7..a06b535 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/ui/activities/BoundaryEditorActivity.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/ui/activities/BoundaryEditorActivity.kt @@ -18,15 +18,42 @@ import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Marker import org.osmdroid.views.overlay.Polygon +/** + * Activity used to update a grazing boundary for a particular collar. + */ class BoundaryEditorActivity : AppCompatActivity(), Marker.OnMarkerDragListener, Marker.OnMarkerClickListener { + /** + * The map displaying the boundary vertices and polygon. + */ private lateinit var map: MapView + + /** + * The list of markers representing the new grazing boundary's edges. + */ private val markers: MutableList = mutableListOf() + + /** + * The polygon used to display the grazing area on the [map]. + */ private lateinit var polygon: GrazingPolygon + + /** + * The center around which the [map] was originally centered, + * used also for creating new vertices. + */ private lateinit var center: GeoPoint + + /** + * The identifier of the collar whose boundary is being changed. + */ private var identifier: Int = -1 + + /** + * The Volley queue used for sending API requests. + */ private lateinit var queue: RequestQueue override fun onCreate(savedInstanceState: Bundle?) { @@ -45,6 +72,9 @@ class BoundaryEditorActivity : AppCompatActivity(), map.controller.setCenter(center) } + /** + * Removes a marker from the [map]. + */ private fun removeMarker(m: Marker) { markers.remove(m) map.overlays.remove(m) @@ -52,6 +82,10 @@ class BoundaryEditorActivity : AppCompatActivity(), map.invalidate() } + /** + * Sends the current list of points to the API endpoint, closing + * the activity if successful. + */ fun sendBoundary(v: View) { val request = SetBoundaryRequest( getString(R.string.apiUrl), @@ -72,6 +106,10 @@ class BoundaryEditorActivity : AppCompatActivity(), queue.add(request) } + /** + * Adds a new marker to the [map], starting it at the previously-configured + * [center]. + */ fun addMarker(v : View) { if(markers.size >= 10) { Toast.makeText( @@ -92,6 +130,11 @@ class BoundaryEditorActivity : AppCompatActivity(), map.invalidate() } + /** + * Ensures that the polygon's vertices are synchronized + * with the user-placed markers, making it so that the + * grazing area is visible to the user. + */ private fun updatePolygon() { polygon.points.clear() if(markers.isEmpty()) return diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/ui/activities/CollarDetailActivity.kt b/app/src/main/java/com/danilafe/fencelessgrazing/ui/activities/CollarDetailActivity.kt index 4042428..5dc7f1a 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/ui/activities/CollarDetailActivity.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/ui/activities/CollarDetailActivity.kt @@ -202,6 +202,9 @@ class CollarDetailActivity : AppCompatActivity() { queue.add(detailRequest) } + /** + * Open the [BoundaryEditorActivity] to edit the current collar's grazing boundary. + */ fun changeGrazingBoundary(v : View) { startActivity(Intent(this, BoundaryEditorActivity::class.java).apply { val center = dataPoints.lastOrNull()?.let { diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/ui/components/GrazingPolygon.kt b/app/src/main/java/com/danilafe/fencelessgrazing/ui/components/GrazingPolygon.kt index 09042f8..71c9ab3 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/ui/components/GrazingPolygon.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/ui/components/GrazingPolygon.kt @@ -4,6 +4,9 @@ import android.graphics.Color import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Polygon +/** + * OpenStreetMaps polygon with some default visual settings for the Fenceless Grazing System. + */ class GrazingPolygon(map: MapView) : Polygon(map) { init { fillPaint.color = Color.parseColor("#32a852")