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

137 lines
4.6 KiB
Kotlin
Raw Normal View History

2020-02-01 20:43:56 -08:00
package com.danilafe.fencelessgrazing
2020-05-12 00:06:58 -07:00
import android.content.Intent
2020-02-01 20:43:56 -08:00
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
2020-02-16 17:40:30 -08:00
import android.widget.Toast
2020-02-16 16:36:25 -08:00
import androidx.preference.PreferenceManager
2020-02-01 20:43:56 -08:00
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
2020-02-16 17:40:30 -08:00
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.toolbox.Volley
import com.danilafe.fencelessgrazing.model.CollarSummary
import com.danilafe.fencelessgrazing.requests.CollarRequest
2020-02-16 16:36:25 -08:00
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
2020-02-16 17:40:30 -08:00
import org.osmdroid.util.GeoPoint
2020-02-16 16:36:25 -08:00
import org.osmdroid.views.MapView
2020-02-16 17:40:30 -08:00
import org.osmdroid.views.overlay.Marker
2020-05-11 22:47:34 -07:00
import java.util.*
import kotlin.concurrent.timerTask
2020-02-01 20:43:56 -08:00
class CollarListActivity : AppCompatActivity() {
2020-02-16 17:40:30 -08:00
// The list of collar summaries and its list adapter.
private val summaries : MutableList<CollarSummary> = mutableListOf()
2020-02-01 20:43:56 -08:00
private lateinit var summaryAdapter: CollarSummaryAdapter
2020-05-11 22:47:34 -07:00
private lateinit var collarList: RecyclerView
2020-02-16 17:40:30 -08:00
// The API token and request queue.
private lateinit var token: String
private lateinit var queue: RequestQueue
// The OpenStreetMap map.
2020-02-16 16:36:25 -08:00
private lateinit var map: MapView
2020-02-16 17:40:30 -08:00
private val collarOverlays: MutableMap<Int, Marker> = mutableMapOf()
2020-02-01 20:43:56 -08:00
2020-05-11 22:47:34 -07:00
// Timer used to schedule refresh
2020-05-12 00:06:58 -07:00
private var refreshTimer = Timer()
2020-05-11 22:47:34 -07:00
2020-02-01 20:43:56 -08:00
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
2020-02-16 16:36:25 -08:00
Configuration.getInstance().load(applicationContext,
PreferenceManager.getDefaultSharedPreferences(applicationContext))
2020-02-01 20:43:56 -08:00
setContentView(R.layout.activity_collar_list)
2020-05-11 22:47:34 -07:00
findViews()
2020-02-01 20:43:56 -08:00
token = intent.getStringExtra("token")!!
2020-02-16 16:36:25 -08:00
map.setTileSource(TileSourceFactory.MAPNIK)
2020-02-16 17:40:30 -08:00
queue = Volley.newRequestQueue(this)
2020-02-01 20:43:56 -08:00
2020-05-11 22:47:34 -07:00
setupCollarList()
2020-02-01 20:43:56 -08:00
}
2020-02-16 16:36:25 -08:00
override fun onResume() {
super.onResume()
map.onResume()
2020-05-12 00:06:58 -07:00
refreshTimer = Timer()
2020-05-11 22:47:34 -07:00
refreshTimer.schedule(timerTask { triggerRefresh() }, 0L, 5000L)
2020-02-16 16:36:25 -08:00
}
override fun onPause() {
super.onPause()
map.onPause()
2020-05-11 22:47:34 -07:00
refreshTimer.cancel()
2020-02-16 16:36:25 -08:00
}
2020-02-16 17:40:30 -08:00
private fun triggerRefresh() {
val request = CollarRequest(getString(R.string.apiUrl), token,
Response.Listener {
summaries.clear()
summaries.addAll(it)
summaryAdapter.notifyDataSetChanged()
updateMapOverlay()
},
Response.ErrorListener {
Toast.makeText(this, "Failed to retrieve collar list!", Toast.LENGTH_SHORT).show()
}
)
queue.add(request)
}
2020-05-11 22:47:34 -07:00
private fun findViews() {
collarList = findViewById(R.id.collarSummaryList)
map = findViewById(R.id.map)
}
2020-05-12 00:06:58 -07:00
private fun startCollarDetailActivity(collar: CollarSummary) {
val newIntent = Intent(this, CollarDetailActivity::class.java).apply {
putExtra("token", token)
putExtra("identifier", collar.id)
}
startActivity(newIntent)
}
2020-05-11 22:47:34 -07:00
private fun setupCollarList() {
val layoutManager = LinearLayoutManager(collarList.context)
2020-05-12 00:06:58 -07:00
summaryAdapter = CollarSummaryAdapter(summaries, object : CollarClickListener {
override fun onCollarClick(collar: CollarSummary?) {
if (collar == null) return
startCollarDetailActivity(collar)
}
})
2020-05-11 22:47:34 -07:00
collarList.adapter = summaryAdapter
collarList.layoutManager = layoutManager
collarList.addItemDecoration(DividerItemDecoration(collarList.context, layoutManager.orientation))
refreshTimer.schedule(timerTask { triggerRefresh() }, 0L, 5000L)
}
2020-02-16 17:40:30 -08:00
private fun updateMapOverlay() {
val currentSet = mutableSetOf<Int>()
summaries.forEach {
// Create or update overlay
val overlay = collarOverlays[it.id] ?: Marker(map)
overlay.title = it.name
overlay.position = GeoPoint(it.pos.longitude.toDouble(), it.pos.latitude.toDouble())
// Store new / existing overlay.
if(!collarOverlays.containsKey(it.id)) map.overlays.add(overlay)
collarOverlays[it.id] = overlay
currentSet.add(it.id)
}
val previousSet = collarOverlays.keys
previousSet.forEach {
if(!currentSet.contains(it)) {
map.overlays.remove(collarOverlays[it])
collarOverlays.remove(it)
}
}
2020-05-11 22:47:34 -07:00
map.invalidate()
2020-02-16 17:40:30 -08:00
}
2020-02-01 20:43:56 -08:00
}