WIP Stats
This commit is contained in:
parent
cd999c2a6e
commit
fbeefa0276
@ -87,6 +87,5 @@ dependencies {
|
||||
|
||||
implementation 'com.caverock:androidsvg-aar:1.4'
|
||||
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
|
||||
implementation "com.github.AppDevNext:AndroidChart:3.1.0.21"
|
||||
implementation 'com.mikepenz:aboutlibraries:11.1.1'
|
||||
}
|
@ -1,57 +1,30 @@
|
||||
package net.helcel.beans.activity
|
||||
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.MenuItem
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.github.mikephil.charting.charts.PieChart
|
||||
import com.github.mikephil.charting.data.PieData
|
||||
import com.github.mikephil.charting.data.PieDataSet
|
||||
import com.github.mikephil.charting.data.PieEntry
|
||||
import com.github.mikephil.charting.formatter.PercentFormatter
|
||||
import com.github.mikephil.charting.utils.MPPointF
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import net.helcel.beans.R
|
||||
import net.helcel.beans.countries.World
|
||||
import net.helcel.beans.helper.Data.groups
|
||||
import net.helcel.beans.helper.Data.visits
|
||||
import net.helcel.beans.helper.Theme.colorWrapper
|
||||
import net.helcel.beans.activity.adapter.StatsListAdapter
|
||||
import net.helcel.beans.databinding.ActivityStatBinding
|
||||
import net.helcel.beans.helper.Theme.createActionBar
|
||||
|
||||
|
||||
class StatActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var chart: PieChart
|
||||
private lateinit var _binding: ActivityStatBinding
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
setContentView(R.layout.activity_stat)
|
||||
_binding = ActivityStatBinding.inflate(layoutInflater)
|
||||
setContentView(_binding.root)
|
||||
createActionBar(this, getString(R.string.action_stat))
|
||||
|
||||
|
||||
chart = findViewById(R.id.chart)
|
||||
chart.setUsePercentValues(true)
|
||||
chart.description.isEnabled = false
|
||||
chart.setExtraOffsets(5F, 10F, 5F, 5F)
|
||||
|
||||
chart.centerText = "Country Area"
|
||||
|
||||
chart.setDrawCenterText(true)
|
||||
chart.isDrawHoleEnabled = true
|
||||
chart.setTransparentCircleColor(Color.TRANSPARENT)
|
||||
chart.setHoleColor(Color.TRANSPARENT)
|
||||
chart.setCenterTextColor(colorWrapper(this, android.R.attr.colorForeground).color)
|
||||
chart.setTransparentCircleAlpha(0)
|
||||
chart.holeRadius = 40F
|
||||
chart.transparentCircleRadius = 40F
|
||||
chart.rotationAngle = 0F
|
||||
chart.isRotationEnabled = false
|
||||
chart.isHighlightPerTapEnabled = false
|
||||
|
||||
chart.legend.isEnabled = false
|
||||
|
||||
bind()
|
||||
_binding.stats.layoutManager =
|
||||
LinearLayoutManager(this, RecyclerView.VERTICAL, false)
|
||||
_binding.stats.adapter = StatsListAdapter()
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
@ -61,44 +34,5 @@ class StatActivity : AppCompatActivity() {
|
||||
|
||||
|
||||
private fun bind() {
|
||||
val entries = ArrayList<PieEntry>()
|
||||
val VIS_continents = World.WWW.children.groupBy { visits.getVisited(it) }
|
||||
.map { Pair(it.key, it.value.map { c -> c.area }.fold(0) { acc, i -> acc + i }) }
|
||||
val VIS_country =
|
||||
World.WWW.children.map { it.children }.flatten().groupBy { visits.getVisited(it) }
|
||||
.map { Pair(it.key, it.value.map { c -> c.area }.fold(0) { acc, i -> acc + i }) }
|
||||
val vis = VIS_country
|
||||
Log.d("VIS", vis.toString())
|
||||
val max = vis.map { it.second }.fold(0) { acc, i -> acc + i }
|
||||
vis.forEach {
|
||||
entries.add(
|
||||
PieEntry(
|
||||
it.second.toFloat().div(max.toFloat()),
|
||||
groups.getGroupFromKey(it.first).name
|
||||
)
|
||||
)
|
||||
}
|
||||
val dataSet = PieDataSet(entries, "GG1")
|
||||
|
||||
dataSet.valueTextColor = Color.BLACK
|
||||
dataSet.sliceSpace = 3f
|
||||
dataSet.iconsOffset = MPPointF(0f, 40f)
|
||||
dataSet.selectionShift = 5f
|
||||
|
||||
|
||||
dataSet.setDrawIcons(true)
|
||||
dataSet.colors = vis.map { groups.getGroupFromKey(it.first).color.color }.toList()
|
||||
|
||||
val data = PieData(dataSet)
|
||||
data.setDrawValues(false)
|
||||
data.setValueFormatter(PercentFormatter())
|
||||
data.setValueTextSize(11f)
|
||||
data.setValueTextColor(Color.BLACK)
|
||||
chart.setEntryLabelColor(Color.BLACK)
|
||||
chart.data = data
|
||||
chart.highlightValues(null)
|
||||
chart.invalidate()
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,73 @@
|
||||
package net.helcel.beans.activity.adapter
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import net.helcel.beans.countries.World
|
||||
import net.helcel.beans.databinding.ItemListGroupBinding
|
||||
import net.helcel.beans.helper.Data
|
||||
import net.helcel.beans.helper.Groups
|
||||
import net.helcel.beans.helper.Theme.getContrastColor
|
||||
|
||||
class StatsListAdapter : RecyclerView.Adapter<StatsListAdapter.StatsViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StatsViewHolder {
|
||||
val binding =
|
||||
ItemListGroupBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||
|
||||
|
||||
return StatsViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: StatsViewHolder, pos: Int) {
|
||||
holder.bind(Data.groups.getGroupFromPos(pos))
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return Data.groups.size()
|
||||
}
|
||||
|
||||
inner class StatsViewHolder(
|
||||
private val _binding: ItemListGroupBinding
|
||||
) : RecyclerView.ViewHolder(_binding.root) {
|
||||
|
||||
private lateinit var data: Pair<Int, Groups.Group>
|
||||
private var countMode: Boolean = true
|
||||
fun bind(entry: Pair<Int, Groups.Group>) {
|
||||
data = entry
|
||||
_binding.groupColor.text = entry.second.name
|
||||
|
||||
val entryColor = data.second.color.color
|
||||
val contrastEntryColor = getContrastColor(entryColor)
|
||||
_binding.groupColor.setBackgroundColor(entryColor)
|
||||
_binding.groupColor.setTextColor(contrastEntryColor)
|
||||
_binding.name.setTextColor(contrastEntryColor)
|
||||
|
||||
_binding.groupColor.setOnClickListener {
|
||||
countMode = !countMode
|
||||
refresh()
|
||||
}
|
||||
refresh()
|
||||
}
|
||||
|
||||
private fun refresh() {
|
||||
val visited = Data.visits.getVisitedByValue(data.first)
|
||||
val wwwCount = World.WWW.children.filter { it.code in visited }
|
||||
val countryCount =
|
||||
World.WWW.children.map { it.children.filter { itt -> itt.code in visited } }
|
||||
.flatten()
|
||||
val stateCount =
|
||||
World.WWW.children.map { it.children.map { itt -> itt.children.filter { ittt -> ittt.code in visited } } }
|
||||
.flatten().flatten()
|
||||
if (countMode) {
|
||||
_binding.name.text = "${wwwCount.size} | ${countryCount.size} | ${stateCount.size}"
|
||||
} else {
|
||||
_binding.name.text =
|
||||
"${wwwCount.sumOf { it.area }} | ${countryCount.sumOf { it.area }} | ${stateCount.sumOf { it.area }}"
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -42,6 +42,10 @@ class Visits(val id: Int, private val locs: HashMap<String, Int>) {
|
||||
return locs.keys.groupBy { getVisited(it) }
|
||||
}
|
||||
|
||||
fun getVisitedByValue(key: Int): List<String> {
|
||||
return locs.filter { it.value == key }.keys.toList()
|
||||
}
|
||||
|
||||
fun reassignAllVisitedtoGroup(group: Int) {
|
||||
val keys = locs.filter { (_, grp) ->
|
||||
grp !in listOf(NO_GROUP, AUTO_GROUP)
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
@ -7,9 +8,47 @@
|
||||
android:theme="@style/Theme.Beans"
|
||||
tools:context=".activity.StatActivity">
|
||||
|
||||
<com.github.mikephil.charting.charts.PieChart
|
||||
android:id="@+id/chart"
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingBottom="10dp">
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/group_color"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="32dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_marginEnd="32dp"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:text="Total"
|
||||
android:textAlignment="textStart"
|
||||
android:textColor="?attr/colorOnPrimary"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="50dp"
|
||||
android:gravity="start|center_vertical"
|
||||
android:paddingStart="20dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:text="0 | 0 | 0"
|
||||
android:textColor="?attr/colorOnPrimary"
|
||||
app:layout_constraintBottom_toBottomOf="@id/group_color"
|
||||
app:layout_constraintEnd_toEndOf="@id/group_color"
|
||||
app:layout_constraintTop_toTopOf="@id/group_color" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/stats"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
Loading…
x
Reference in New Issue
Block a user