Merge remote-tracking branch 'origin/dev' into dev

feature/top10
Razmig Sarkissian 7 years ago
commit 125993d285
  1. 2
      app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt
  2. 4
      app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt
  3. 14
      app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt
  4. 11
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt
  5. 10
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt
  6. 107
      app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt
  7. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/MoreFragment.kt
  8. 11
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt
  9. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt
  10. 26
      app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt
  11. 3
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  12. 16
      app/src/main/res/layout-sw320dp/fragment_calendar.xml
  13. 38
      app/src/main/res/layout-sw400dp/fragment_calendar.xml
  14. 16
      app/src/main/res/layout/fragment_calendar.xml
  15. 30
      app/src/main/res/layout/fragment_calendar_details.xml
  16. 11
      app/src/main/res/layout/row_graph.xml

@ -71,7 +71,7 @@ enum class Comparator {
BLIND -> {
val blinds = arrayListOf<QueryCondition.BLIND>()
val realm = Realm.getDefaultInstance()
realm.where<Session>().distinct("blind", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map {
realm.where<Session>().distinct("blinds", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map {
it.blinds?.let { stake ->
blinds.add(QueryCondition.BLIND().apply { setBlind(stake, it.hasDefaultCurrency)})
}

@ -22,12 +22,14 @@ class StatisticDetailsActivity : PokerAnalyticsActivity() {
// Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects
var parameters: GraphParameters? = null
var displayAggregationChoices: Boolean = true
/**
* Default constructor
*/
fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report) {
fun newInstance(context: Context, stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true) {
parameters = GraphParameters(stat, group, report)
this.displayAggregationChoices = displayAggregationChoices
val intent = Intent(context, StatisticDetailsActivity::class.java)
context.startActivity(intent)
}

@ -5,11 +5,13 @@ import android.content.Context
import android.content.Intent
import android.content.res.Resources
import android.net.Uri
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.AppCompatTextView
import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import net.pokeranalytics.android.BuildConfig
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.TextFormat
@ -108,3 +110,15 @@ fun AppCompatTextView.setTextFormat(textFormat: TextFormat, context: Context) {
this.setTextColor(textFormat.getColor(context))
this.text = textFormat.text
}
fun View.hideWithAnimation() {
isVisible = true
animate().cancel()
animate().alpha(0f).withEndAction { isVisible = false }.start()
}
fun View.showWithAnimation() {
isVisible = true
animate().cancel()
animate().alpha(1f).start()
}

@ -6,6 +6,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.tabs.TabLayout
import io.realm.Realm
@ -72,7 +73,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable
is GraphRow -> {
//TODO: Open graph details
row.report.results.firstOrNull()?.group?.let { computableGroup ->
StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report)
StatisticDetailsActivity.newInstance(requireContext(), row.stat, computableGroup, row.report, false)
}
}
}
@ -146,6 +147,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable
*/
private fun launchStatComputation() {
progressBar.isVisible = true
progressBar.animate().alpha(1f).start()
recyclerView.animate().alpha(0f).start()
computedResults?.let { computedResults ->
GlobalScope.launch {
@ -193,6 +198,10 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable
launch(Dispatchers.Main) {
statsAdapter.notifyDataSetChanged()
progressBar.animate().cancel()
progressBar.animate().alpha(0f).withEndAction { progressBar.isVisible = false }.start()
recyclerView.animate().cancel()
recyclerView.animate().alpha(1f).start()
}
}
}

@ -23,6 +23,8 @@ import net.pokeranalytics.android.ui.activity.CalendarDetailsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.extensions.hideWithAnimation
import net.pokeranalytics.android.ui.extensions.showWithAnimation
import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment
import net.pokeranalytics.android.ui.view.CalendarTabs
import net.pokeranalytics.android.ui.view.RowRepresentable
@ -219,6 +221,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
*/
private fun launchStatComputation() {
progressBar?.showWithAnimation()
recyclerView?.hideWithAnimation()
GlobalScope.launch {
val calendar = Calendar.getInstance()
@ -303,6 +308,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
}
*/
realm.close()
GlobalScope.launch(Dispatchers.Main) {
displayData()
}
@ -373,6 +380,9 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
calendarAdapter.notifyDataSetChanged()
progressBar?.hideWithAnimation()
recyclerView?.showWithAnimation()
}
}

@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.charts.BarLineChartBase
import com.github.mikephil.charting.charts.LineChart
@ -34,35 +35,33 @@ class GraphParameters(var stat: Stat, var computableGroup: ComputableGroup, var
class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, CoroutineScope {
companion object {
/**
* Create new instance
*/
fun newInstance(): GraphFragment {
val fragment = GraphFragment()
val bundle = Bundle()
fragment.arguments = bundle
return fragment
}
}
private lateinit var parentActivity: PokerAnalyticsActivity
private lateinit var computableGroup: ComputableGroup
private lateinit var selectedReport: Report
private lateinit var legendView: LegendView
private lateinit var chartView: BarLineChartBase<*>
private var stat: Stat = Stat.NETRESULT
private var reports: MutableMap<AggregationType, Report> = hashMapOf()
lateinit private var computableGroup: ComputableGroup
lateinit private var selectedReport: Report
lateinit var legendView: LegendView
lateinit var chartView: BarLineChartBase<*>
private var aggregationTypes: List<AggregationType> = listOf()
private var displayAggregationChoices: Boolean = true
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main
companion object {
}
fun setData(stat: Stat, group: ComputableGroup, report: Report) {
this.stat = stat
this.computableGroup = group
this.aggregationTypes = stat.aggregationTypes
this.reports[this.aggregationTypes.first()] = report
this.selectedReport = report
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_evograph, container, false)
@ -73,6 +72,35 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co
initUI()
}
// OnChartValueSelectedListener
override fun onNothingSelected() {
// nothing to do
}
override fun onValueSelected(e: Entry?, h: Highlight?) {
e?.let { entry ->
val statEntry = when (entry.data) {
is ObjectIdentifier -> {
val identifier = entry.data as ObjectIdentifier
getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull()
}
is StatEntry -> entry.data as StatEntry?
else -> null
}
statEntry?.let {
val formattedDate = it.entryTitle
val entryValue = it.formattedValue(this.stat, requireContext())
val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext())
this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue)
}
}
}
/**
* Init UI
*/
@ -103,6 +131,7 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co
this.chipGroup.addView(chip)
}
this.chipGroup.isVisible = displayAggregationChoices
this.chipGroup.check(this.stat.aggregationTypes.first().ordinal)
this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() {
@ -196,35 +225,17 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener, Co
}
// OnChartValueSelectedListener
override fun onNothingSelected() {
// nothing to do
}
override fun onValueSelected(e: Entry?, h: Highlight?) {
e?.let { entry ->
val statEntry = when (entry.data) {
is ObjectIdentifier -> {
val identifier = entry.data as ObjectIdentifier
getRealm().where(identifier.clazz).equalTo("id", identifier.id).findAll().firstOrNull()
}
is StatEntry -> entry.data as StatEntry?
else -> null
}
statEntry?.let {
val formattedDate = it.entryTitle
val entryValue = it.formattedValue(this.stat, requireContext())
val totalStatValue = this.stat.format(e.y.toDouble(), currency = null, context = requireContext())
this.legendView.setItemData(this.stat, formattedDate, entryValue, totalStatValue)
}
/**
* Set data
*/
fun setData(stat: Stat, group: ComputableGroup, report: Report, displayAggregationChoices: Boolean = true) {
this.stat = stat
this.computableGroup = group
}
this.aggregationTypes = stat.aggregationTypes
this.reports[this.aggregationTypes.first()] = report
this.selectedReport = report
this.displayAggregationChoices = displayAggregationChoices
}

@ -44,7 +44,7 @@ class MoreFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource,
// Life Cycle
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_calendar, container, false)
return inflater.inflate(R.layout.fragment_more, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

@ -7,13 +7,13 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_stats.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.activity.ComparisonChartActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.ReportRow
import timber.log.Timber
class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate {
@ -59,7 +59,13 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
super.onRowSelected(position, row, fromAction)
ComparisonChartActivity.newInstance(requireContext())
Timber.d("row: $row")
when (row) {
ReportRow.DAY_OF_WEEKS -> {
//TODO: Open ComparisonChartActivity with correct data
//TODO: Calcul report before or after
}
}
}
@ -87,4 +93,5 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
}
}
}

@ -61,7 +61,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() {
fragmentTransaction.commit()
StatisticDetailsActivity.parameters?.let {
fragment.setData(it.stat, it.computableGroup, it.report)
fragment.setData(it.stat, it.computableGroup, it.report, StatisticDetailsActivity.displayAggregationChoices)
StatisticDetailsActivity.parameters = null
} ?: run {
throw Exception("Missing graph parameters")

@ -1,31 +1,29 @@
package net.pokeranalytics.android.ui.graph
import android.content.Context
import android.graphics.Typeface
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import com.github.mikephil.charting.charts.BarLineChartBase
import com.github.mikephil.charting.components.XAxis
import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.extensions.px
fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) {
// X Axis
this.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default)
this.xAxis.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px)
this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default)
this.xAxis.labelCount = 4
this.xAxis.position = XAxis.XAxisPosition.BOTTOM
this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default)
this.xAxis.typeface = Typeface.DEFAULT
this.xAxis.labelCount = 4
this.xAxis.position = XAxis.XAxisPosition.BOTTOM
this.xAxis.setDrawLabels(true)
this.xAxis.setDrawGridLines(true)
this.xAxis.granularity = 1.0f
this.xAxis.isGranularityEnabled = true
this.xAxis.granularity = 1.0f
this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default)
this.xAxis.typeface = ResourcesCompat.getFont(context, R.font.roboto_medium)
this.xAxis.labelCount = 4
this.xAxis.textSize = 12f
this.xAxis.isEnabled = true
// Y Axis
@ -41,13 +39,15 @@ fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) {
this.axisLeft.granularity = 1.0f
this.axisLeft.textColor = ContextCompat.getColor(context, R.color.chart_default)
this.axisLeft.typeface = Typeface.DEFAULT
this.axisLeft.labelCount =
if (small) 1 else 7 // @todo not great if interval is [0..2] for number of records as we get decimals
this.axisLeft.typeface = ResourcesCompat.getFont(context, R.font.roboto_medium)
this.axisLeft.labelCount = if (small) 1 else 7 // @todo not great if interval is [0..2] for number of records as we get decimals
this.axisLeft.textSize = 12f
this.axisRight.isEnabled = false
this.legend.isEnabled = false
this.description.isEnabled = false
this.data?.isHighlightEnabled = !small
// @todo
// if timeYAxis {

@ -329,6 +329,7 @@ enum class RowViewType(private var layoutRes: Int) {
val colors = arrayOf(R.color.green_light).toIntArray()
dataSet.setColors(colors, context)
dataSet.setDrawCircles(false)
dataSet.setDrawValues(false)
val lineData = LineData(listOf(dataSet))
val chartView = when (row.stat.graphType) {
@ -348,7 +349,7 @@ enum class RowViewType(private var layoutRes: Int) {
it.addView(chartView)
}
chartView.setStyle(false, context)
chartView.setStyle(true, context)
chartView.setTouchEnabled(false)
chartView.highlightValue((entries.size - 1).toFloat(), 0)
}

@ -83,6 +83,22 @@
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:alpha="0"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBar" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp"

@ -17,28 +17,28 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="8dp"
android:orientation="horizontal">
android:orientation="horizontal"
android:padding="8dp">
<com.google.android.material.chip.ChipGroup
android:id="@+id/filtersTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:singleSelection="false"
app:chipSpacing="8dp">
app:chipSpacing="8dp"
app:singleSelection="false">
<com.google.android.material.chip.Chip
android:id="@+id/filterTimeMonth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/month"/>
android:text="@string/month" />
<com.google.android.material.chip.Chip
android:id="@+id/filterTimeYear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/year"/>
android:text="@string/year" />
</com.google.android.material.chip.ChipGroup>
@ -51,27 +51,27 @@
android:id="@+id/filtersSession"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:singleSelection="false"
app:chipSpacing="6dp">
app:chipSpacing="6dp"
app:singleSelection="false">
<com.google.android.material.chip.Chip
android:id="@+id/filterSessionAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/all"/>
android:text="@string/all" />
<com.google.android.material.chip.Chip
android:id="@+id/filterSessionCash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cash_game"/>
android:text="@string/cash_game" />
<com.google.android.material.chip.Chip
android:id="@+id/filterSessionTournament"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tournament"/>
android:text="@string/tournament" />
</com.google.android.material.chip.ChipGroup>
@ -87,6 +87,22 @@
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:alpha="0"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBar" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp"

@ -88,6 +88,22 @@
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:alpha="0"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBar" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp"

@ -32,31 +32,49 @@
android:id="@+id/tabAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/all"/>
android:text="@string/all" />
<com.google.android.material.tabs.TabItem
android:id="@+id/tabCash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cash_game"/>
android:text="@string/cash_game" />
<com.google.android.material.tabs.TabItem
android:id="@+id/tabTournament"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tournament"/>
android:text="@string/tournament" />
</com.google.android.material.tabs.TabLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:alpha="0"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/recyclerView"
tools:alpha="1"
tools:visibility="visible" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@+id/appBar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appBar" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -2,17 +2,18 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
android:layout_height="wrap_content">
<FrameLayout
android:id="@+id/chartContainer"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="2:1"
android:foreground="?selectableItemBackground"
android:paddingTop="8dp"
android:paddingBottom="8dp"
app:layout_constraintDimensionRatio="5:2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:foreground="?selectableItemBackground" />
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save