app/app/src/main/java/com/danilafe/fencelessgrazing/ui/activities/DistanceTraveledGraph.kt

110 lines
3.8 KiB
Kotlin

package com.danilafe.fencelessgrazing.ui.activities
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.toolbox.Volley
import com.danilafe.fencelessgrazing.R
import com.danilafe.fencelessgrazing.model.CollarDistance
import com.danilafe.fencelessgrazing.requests.authenticated.DistanceTraveledRequest
import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet
import com.github.mikephil.charting.data.BarEntry
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter
import com.github.mikephil.charting.utils.ColorTemplate
/**
* One of the tabs from the [StatisticsActivity]. Contains the graph
* of the distance traveled by each animal, retrieved via the [DistanceTraveledRequest]
* from the API.
*/
class DistanceTraveledGraph() : Fragment() {
/**
* The BarChart used to display the distance data.
*/
private lateinit var distanceTraveledChart: BarChart
/**
* The Volley queue used for making API requests.
*/
private lateinit var queue : RequestQueue
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.distance_traveled_layoyt, container, false)
distanceTraveledChart = view.findViewById(R.id.distanceTraveledChart)
setupChart()
return view
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
queue = Volley.newRequestQueue(requireActivity().applicationContext)
triggerRefresh()
}
/**
* Send the API request to retrieve updated distance data.
*/
private fun triggerRefresh() {
val activity = requireActivity()
val sharedPrefs = activity.getSharedPreferences("FencelessGrazing", 0)
val token = sharedPrefs.getString("token", null)!!
val request =
DistanceTraveledRequest(activity.getString(R.string.apiUrl),
token,
Response.Listener {
updateChartData(it)
},
Response.ErrorListener {
Toast.makeText(
activity,
"Failed to retrieve distance traveled!",
Toast.LENGTH_SHORT
).show()
}
)
queue.add(request)
}
/**
* Updates the [distanceTraveledChart] with newly retrieved distance data.
*/
private fun updateChartData(distances: List<CollarDistance>) {
val entries = mutableListOf<BarEntry>()
val labels = distances.map { c -> c.name }
distances.forEachIndexed { i, v ->
entries.add(BarEntry(i.toFloat(), v.distance))
}
val dataSet = BarDataSet(entries, "Distance Traveled")
dataSet.colors = ColorTemplate.PASTEL_COLORS.toList()
val data = BarData(dataSet)
data.barWidth = 0.8f
distanceTraveledChart.data = data
distanceTraveledChart.xAxis.valueFormatter = IndexAxisValueFormatter(labels)
distanceTraveledChart.invalidate()
}
/**
* Configure the [distanceTraveledChart] with the proper visual settings.
*/
private fun setupChart() {
distanceTraveledChart.setFitBars(true)
distanceTraveledChart.xAxis.granularity = 1.0f
distanceTraveledChart.xAxis.isGranularityEnabled = true
distanceTraveledChart.xAxis.position = XAxis.XAxisPosition.BOTTOM
distanceTraveledChart.invalidate()
}
}