From 8bf4f513b7189a3f5a744c8cfdaf0d7c6fc2404b Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Tue, 12 May 2020 18:39:35 -0700 Subject: [PATCH] Center the map on collars when possible --- .../fencelessgrazing/CollarDetailActivity.kt | 16 +++++++-------- .../fencelessgrazing/CollarListActivity.kt | 20 +++++++++++++++++-- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/CollarDetailActivity.kt b/app/src/main/java/com/danilafe/fencelessgrazing/CollarDetailActivity.kt index ab158ad..c8fa862 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/CollarDetailActivity.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/CollarDetailActivity.kt @@ -1,18 +1,14 @@ package com.danilafe.fencelessgrazing -import android.app.Application import android.graphics.Color import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -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 import com.danilafe.fencelessgrazing.model.CollarPos -import com.danilafe.fencelessgrazing.model.CollarSummary import com.danilafe.fencelessgrazing.model.Polygon import com.danilafe.fencelessgrazing.requests.CollarDetailRequest import com.danilafe.fencelessgrazing.requests.CollarHistoryRequest @@ -20,9 +16,7 @@ import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Marker import org.osmdroid.views.overlay.Polyline -import java.sql.Time import java.util.* -import kotlin.collections.ArrayList import kotlin.concurrent.timerTask class CollarDetailActivity : AppCompatActivity() { @@ -34,6 +28,7 @@ class CollarDetailActivity : AppCompatActivity() { private lateinit var queue: RequestQueue private var collarId: Int = -1 + private var centerSet: Boolean = false private lateinit var map: MapView private var refreshTimer = Timer() @@ -67,6 +62,7 @@ class CollarDetailActivity : AppCompatActivity() { queue = Volley.newRequestQueue(this) map = findViewById(R.id.detailMap) + map.controller.setZoom(9.5) mapPolygon = org.osmdroid.views.overlay.Polygon(map) mapMarker = Marker(map) mapPolyline = Polyline(map) @@ -127,11 +123,15 @@ class CollarDetailActivity : AppCompatActivity() { private fun updateAnimalHistory(points : List) { val currentPoint = points.first() - mapMarker.position = currentPoint - mapPolyline.setPoints(points) collarPos.text = getString(R.string.collarSummaryLocation, currentPoint.longitude, currentPoint.latitude) if(!map.overlays.contains(mapMarker)) map.overlays.add(mapMarker) if(!map.overlays.contains(mapPolyline)) map.overlays.add(mapPolyline) + mapMarker.position = currentPoint + mapPolyline.setPoints(points) + if(!centerSet) { + centerSet = true + map.controller.setCenter(currentPoint) + } map.invalidate() } diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/CollarListActivity.kt b/app/src/main/java/com/danilafe/fencelessgrazing/CollarListActivity.kt index 2a032c2..0a5e8b9 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/CollarListActivity.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/CollarListActivity.kt @@ -3,7 +3,6 @@ package com.danilafe.fencelessgrazing import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.util.Log import android.widget.Toast import androidx.preference.PreferenceManager import androidx.recyclerview.widget.DividerItemDecoration @@ -34,6 +33,7 @@ class CollarListActivity : AppCompatActivity() { private lateinit var queue: RequestQueue // The OpenStreetMap map. + private var centerSet: Boolean = false private lateinit var map: MapView private val collarOverlays: MutableMap = mutableMapOf() @@ -51,6 +51,7 @@ class CollarListActivity : AppCompatActivity() { token = intent.getStringExtra("token")!! map.setTileSource(TileSourceFactory.MAPNIK) + map.controller.setZoom(9.5) queue = Volley.newRequestQueue(this) setupCollarList() @@ -76,7 +77,7 @@ class CollarListActivity : AppCompatActivity() { summaries.clear() summaries.addAll(it) summaryAdapter.notifyDataSetChanged() - updateMapOverlay() + updateMap() }, Response.ErrorListener { Toast.makeText(this, "Failed to retrieve collar list!", Toast.LENGTH_SHORT).show() @@ -111,6 +112,20 @@ class CollarListActivity : AppCompatActivity() { collarList.addItemDecoration(DividerItemDecoration(collarList.context, layoutManager.orientation)) } + private fun updateMap() { + updateMapCenter() + updateMapOverlay() + } + + private fun updateMapCenter() { + if(centerSet) return + + centerSet = true + val averageLongitude = summaries.map { it.pos.longitude.toDouble() }.average() + val averageLatitude = summaries.map { it.pos.latitude.toDouble() }.average() + map.controller.setCenter(GeoPoint(averageLongitude, averageLatitude)) + } + private fun updateMapOverlay() { val currentSet = mutableSetOf() summaries.forEach { @@ -132,6 +147,7 @@ class CollarListActivity : AppCompatActivity() { collarOverlays.remove(it) } } + map.invalidate() } }