app/app/src/main/java/com/danilafe/fencelessgrazing/CollarDetailActivity.kt

158 lines
5.3 KiB
Kotlin
Raw Normal View History

2020-05-12 00:06:58 -07:00
package com.danilafe.fencelessgrazing
2020-05-12 18:25:19 -07:00
import android.app.Application
2020-05-12 00:51:53 -07:00
import android.graphics.Color
2020-05-12 00:06:58 -07:00
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
2020-05-12 18:25:19 -07:00
import android.util.Log
import android.widget.TextView
import android.widget.Toast
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.toolbox.Volley
2020-05-12 00:51:53 -07:00
import com.danilafe.fencelessgrazing.model.CollarPos
import com.danilafe.fencelessgrazing.model.CollarSummary
2020-05-12 00:51:53 -07:00
import com.danilafe.fencelessgrazing.model.Polygon
import com.danilafe.fencelessgrazing.requests.CollarDetailRequest
import com.danilafe.fencelessgrazing.requests.CollarHistoryRequest
2020-05-12 00:51:53 -07:00
import org.osmdroid.util.GeoPoint
import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.Marker
2020-05-12 18:25:19 -07:00
import org.osmdroid.views.overlay.Polyline
import java.sql.Time
import java.util.*
2020-05-12 18:25:19 -07:00
import kotlin.collections.ArrayList
import kotlin.concurrent.timerTask
2020-05-12 00:06:58 -07:00
class CollarDetailActivity : AppCompatActivity() {
private lateinit var collarName: TextView
private lateinit var collarPos: TextView
2020-05-12 00:06:58 -07:00
private lateinit var token: String
private lateinit var queue: RequestQueue
2020-05-12 00:06:58 -07:00
private var collarId: Int = -1
2020-05-12 00:51:53 -07:00
private lateinit var map: MapView
private var refreshTimer = Timer()
2020-05-12 00:51:53 -07:00
private lateinit var mapPolygon: org.osmdroid.views.overlay.Polygon
private var boundingBox: Polygon? = null
set(newValue) {
if(newValue != null) updateBoundingBox(field, newValue)
else clearBoundingBox()
field = newValue
}
private lateinit var mapMarker: Marker
2020-05-12 18:25:19 -07:00
private lateinit var mapPolyline: Polyline
private var dataPoints: List<GeoPoint> = listOf()
set(newValue) {
if(newValue.isNotEmpty()) updateAnimalHistory(newValue)
else clearAnimalHistory()
field = newValue
}
2020-05-12 00:06:58 -07:00
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_collar_detail)
collarName = findViewById(R.id.collarName)
collarPos = findViewById(R.id.collarPos)
2020-05-12 00:06:58 -07:00
token = intent.getStringExtra("token")!!
collarId = intent.getIntExtra("identifier", -1)
queue = Volley.newRequestQueue(this)
2020-05-12 00:51:53 -07:00
map = findViewById(R.id.detailMap)
mapPolygon = org.osmdroid.views.overlay.Polygon(map)
mapMarker = Marker(map)
2020-05-12 18:25:19 -07:00
mapPolyline = Polyline(map)
2020-05-12 00:51:53 -07:00
configureMapPolygon()
boundingBox = Polygon(
listOf(
CollarPos("20", "20"),
CollarPos("20", "21"),
CollarPos("21", "21"),
CollarPos("21", "20")
)
)
}
override fun onPause() {
super.onPause()
map.onPause()
refreshTimer.cancel()
2020-05-12 18:15:32 -07:00
refreshTimer.purge()
}
override fun onResume() {
super.onResume()
map.onResume()
refreshTimer = Timer()
refreshTimer.schedule(timerTask { triggerRefresh() }, 0L, 5000L)
}
private fun triggerRefresh() {
val historyRequest = CollarHistoryRequest(getString(R.string.apiUrl), collarId, token,
Response.Listener {
dataPoints = it.map { p -> GeoPoint(p.longitude.toDouble(), p.latitude.toDouble()) }
},
Response.ErrorListener {
Toast.makeText(this, "Failed to retrieve history of collar", Toast.LENGTH_SHORT).show()
}
)
val detailRequest = CollarDetailRequest(getString(R.string.apiUrl), collarId, token,
Response.Listener {
collarName.text = it.name
},
Response.ErrorListener {
Toast.makeText(this, "Failed to retrieve details of collar", Toast.LENGTH_SHORT).show()
}
)
queue.add(historyRequest)
queue.add(detailRequest)
2020-05-12 00:51:53 -07:00
}
private fun configureMapPolygon() {
mapPolygon.fillPaint.color = Color.parseColor("#32a852")
2020-05-12 00:51:53 -07:00
mapPolygon.fillPaint.alpha = 127
mapPolygon.outlinePaint.color = Color.parseColor("#227539")
2020-05-12 00:51:53 -07:00
mapPolygon.outlinePaint.strokeWidth = 0.0f
mapPolygon.title = "Valid Grazing Area"
}
private fun updateAnimalHistory(points : List<GeoPoint>) {
val currentPoint = points.first()
mapMarker.position = currentPoint
2020-05-12 18:25:19 -07:00
mapPolyline.setPoints(points)
collarPos.text = getString(R.string.collarSummaryLocation, currentPoint.longitude, currentPoint.latitude)
if(!map.overlays.contains(mapMarker)) map.overlays.add(mapMarker)
2020-05-12 18:25:19 -07:00
if(!map.overlays.contains(mapPolyline)) map.overlays.add(mapPolyline)
map.invalidate()
}
private fun clearAnimalHistory() {
map.overlays.remove(mapMarker)
2020-05-12 18:25:19 -07:00
map.overlays.remove(mapPolyline)
map.invalidate()
}
2020-05-12 00:51:53 -07:00
private fun updateBoundingBox(oldValue: Polygon?, polygon: Polygon) {
if(oldValue == null) map.overlays.add(mapPolygon)
val points = polygon.dataPoints.map { GeoPoint(it.longitude.toDouble(), it.latitude.toDouble()) }
val polygonPoints = points.toMutableList()
polygonPoints.add(polygonPoints[0])
mapPolygon.points = polygonPoints
map.invalidate()
2020-05-12 00:51:53 -07:00
}
private fun clearBoundingBox() {
map.overlays.remove(mapPolygon)
map.invalidate()
2020-05-12 00:06:58 -07:00
}
}