|
|
|
@ -28,96 +28,96 @@ import kotlin.coroutines.CoroutineContext |
|
|
|
class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope, |
|
|
|
class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope, |
|
|
|
RowRepresentableDelegate { |
|
|
|
RowRepresentableDelegate { |
|
|
|
|
|
|
|
|
|
|
|
override val coroutineContext: CoroutineContext |
|
|
|
override val coroutineContext: CoroutineContext |
|
|
|
get() = Dispatchers.Main |
|
|
|
get() = Dispatchers.Main |
|
|
|
|
|
|
|
|
|
|
|
private var rowRepresentables: ArrayList<RowRepresentable> = ArrayList() |
|
|
|
private var rowRepresentables: ArrayList<RowRepresentable> = ArrayList() |
|
|
|
private var stringAll = "" |
|
|
|
private var stringAll = "" |
|
|
|
private var stringCashGame = "" |
|
|
|
private var stringCashGame = "" |
|
|
|
private var stringTournament = "" |
|
|
|
private var stringTournament = "" |
|
|
|
|
|
|
|
|
|
|
|
private lateinit var statsAdapter: RowRepresentableAdapter |
|
|
|
private lateinit var statsAdapter: RowRepresentableAdapter |
|
|
|
private var report : Report? = null |
|
|
|
private var report: Report? = null |
|
|
|
|
|
|
|
|
|
|
|
companion object { |
|
|
|
companion object { |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Create new instance |
|
|
|
* Create new instance |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
fun newInstance(): StatsFragment { |
|
|
|
fun newInstance(): StatsFragment { |
|
|
|
val fragment = StatsFragment() |
|
|
|
val fragment = StatsFragment() |
|
|
|
val bundle = Bundle() |
|
|
|
val bundle = Bundle() |
|
|
|
fragment.arguments = bundle |
|
|
|
fragment.arguments = bundle |
|
|
|
return fragment |
|
|
|
return fragment |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Life Cycle |
|
|
|
// Life Cycle |
|
|
|
|
|
|
|
|
|
|
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { |
|
|
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { |
|
|
|
return inflater.inflate(R.layout.fragment_stats, container, false) |
|
|
|
return inflater.inflate(R.layout.fragment_stats, container, false) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
|
|
|
super.onViewCreated(view, savedInstanceState) |
|
|
|
super.onViewCreated(view, savedInstanceState) |
|
|
|
initData() |
|
|
|
initData() |
|
|
|
initUI() |
|
|
|
initUI() |
|
|
|
launchStatComputation() |
|
|
|
launchStatComputation() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Row Representable DS |
|
|
|
// Row Representable DS |
|
|
|
|
|
|
|
|
|
|
|
override fun adapterRows(): List<RowRepresentable>? { |
|
|
|
override fun adapterRows(): List<RowRepresentable>? { |
|
|
|
return this.rowRepresentables |
|
|
|
return this.rowRepresentables |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
override fun contentDescriptorForRow(row: RowRepresentable): DisplayDescriptor? { |
|
|
|
override fun contentDescriptorForRow(row: RowRepresentable): DisplayDescriptor? { |
|
|
|
val dc = DisplayDescriptor() |
|
|
|
val dc = DisplayDescriptor() |
|
|
|
dc.textFormat = TextFormat(NULL_TEXT) |
|
|
|
dc.textFormat = TextFormat(NULL_TEXT) |
|
|
|
if (row is StatRepresentable) { |
|
|
|
if (row is StatRepresentable) { |
|
|
|
context?.let { context -> |
|
|
|
context?.let { context -> |
|
|
|
row.computedStat?.let { |
|
|
|
row.computedStat?.let { |
|
|
|
dc.textFormat = it.format(context) |
|
|
|
dc.textFormat = it.format(context) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return dc |
|
|
|
return dc |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
override fun statFormatForRow(row: RowRepresentable): TextFormat { |
|
|
|
override fun statFormatForRow(row: RowRepresentable): TextFormat { |
|
|
|
if (row is StatRepresentable) { |
|
|
|
if (row is StatRepresentable) { |
|
|
|
context?.let { context -> |
|
|
|
context?.let { context -> |
|
|
|
row.computedStat?.let { return it.format(context) } |
|
|
|
row.computedStat?.let { return it.format(context) } |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return TextFormat(NULL_TEXT) |
|
|
|
return TextFormat(NULL_TEXT) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
override fun onResume() { |
|
|
|
override fun onResume() { |
|
|
|
super.onResume() |
|
|
|
super.onResume() |
|
|
|
statsAdapter.notifyDataSetChanged() |
|
|
|
statsAdapter.notifyDataSetChanged() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Override |
|
|
|
// Override |
|
|
|
|
|
|
|
|
|
|
|
override fun sessionsChanged() { |
|
|
|
override fun sessionsChanged() { |
|
|
|
this.launchStatComputation() |
|
|
|
this.launchStatComputation() |
|
|
|
this.statsAdapter.notifyDataSetChanged() |
|
|
|
this.statsAdapter.notifyDataSetChanged() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Business |
|
|
|
// Business |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Init data |
|
|
|
* Init data |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private fun initData() { |
|
|
|
private fun initData() { |
|
|
|
|
|
|
|
|
|
|
|
this.stringAll = getString(R.string.all) |
|
|
|
this.stringAll = getString(R.string.all) |
|
|
|
this.stringCashGame = getString(R.string.cash_game) |
|
|
|
this.stringCashGame = getString(R.string.cash_game) |
|
|
|
this.stringTournament = getString(R.string.tournament) |
|
|
|
this.stringTournament = getString(R.string.tournament) |
|
|
|
|
|
|
|
|
|
|
|
this.statsAdapter = RowRepresentableAdapter(this, this) |
|
|
|
this.statsAdapter = RowRepresentableAdapter(this, this) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Init UI |
|
|
|
* Init UI |
|
|
|
@ -133,67 +133,89 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private fun launchStatComputation() { |
|
|
|
private fun launchStatComputation() { |
|
|
|
|
|
|
|
|
|
|
|
GlobalScope.launch(coroutineContext) { |
|
|
|
GlobalScope.launch(coroutineContext) { |
|
|
|
|
|
|
|
|
|
|
|
var r = Report() |
|
|
|
|
|
|
|
val test = GlobalScope.async { |
|
|
|
|
|
|
|
val s = Date() |
|
|
|
|
|
|
|
Timber.d(">>> start...") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
|
|
|
|
r = createSessionGroupsAndStartCompute(realm) |
|
|
|
|
|
|
|
report = r |
|
|
|
|
|
|
|
realm.close() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val e = Date() |
|
|
|
|
|
|
|
val duration = (e.time - s.time) / 1000.0 |
|
|
|
|
|
|
|
Timber.d(">>> ended in $duration seconds") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
var r = Report() |
|
|
|
test.await() |
|
|
|
val test = GlobalScope.async { |
|
|
|
|
|
|
|
val s = Date() |
|
|
|
|
|
|
|
Timber.d(">>> start...") |
|
|
|
|
|
|
|
|
|
|
|
if (!isDetached) { |
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
showResults(r) |
|
|
|
r = createSessionGroupsAndStartCompute(realm) |
|
|
|
} |
|
|
|
report = r |
|
|
|
} |
|
|
|
realm.close() |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
val e = Date() |
|
|
|
|
|
|
|
val duration = (e.time - s.time) / 1000.0 |
|
|
|
|
|
|
|
Timber.d(">>> ended in $duration seconds") |
|
|
|
|
|
|
|
|
|
|
|
private fun createSessionGroupsAndStartCompute(realm: Realm) : Report { |
|
|
|
} |
|
|
|
|
|
|
|
test.await() |
|
|
|
|
|
|
|
|
|
|
|
val allStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.AVERAGE, Stat.NUMBER_OF_SETS, Stat.AVERAGE_DURATION, Stat.DURATION) |
|
|
|
if (!isDetached) { |
|
|
|
val allSessionGroup = ComputableGroup(stringAll, listOf(), allStats) |
|
|
|
showResults(r) |
|
|
|
val cgStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.NET_BB_PER_100_HANDS, Stat.HOURLY_RATE_BB, Stat.AVERAGE, Stat.STANDARD_DEVIATION_HOURLY, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) |
|
|
|
} |
|
|
|
val cgSessionGroup = ComputableGroup(stringCashGame, listOf(QueryCondition.CASH), cgStats) |
|
|
|
} |
|
|
|
val tStats: List<Stat> = listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) |
|
|
|
|
|
|
|
val tSessionGroup = ComputableGroup(stringTournament, listOf(QueryCondition.TOURNAMENT), tStats) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Timber.d(">>>>> Start computations...") |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return Calculator.computeGroups(realm, listOf(allSessionGroup, cgSessionGroup, tSessionGroup), Calculator.Options()) |
|
|
|
private fun createSessionGroupsAndStartCompute(realm: Realm): Report { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val allStats: List<Stat> = listOf( |
|
|
|
|
|
|
|
Stat.NETRESULT, |
|
|
|
|
|
|
|
Stat.HOURLY_RATE, |
|
|
|
|
|
|
|
Stat.AVERAGE, |
|
|
|
|
|
|
|
Stat.NUMBER_OF_SETS, |
|
|
|
|
|
|
|
Stat.AVERAGE_DURATION, |
|
|
|
|
|
|
|
Stat.DURATION |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
val allSessionGroup = ComputableGroup(stringAll, listOf(), allStats) |
|
|
|
|
|
|
|
val cgStats: List<Stat> = listOf( |
|
|
|
|
|
|
|
Stat.NETRESULT, |
|
|
|
|
|
|
|
Stat.HOURLY_RATE, |
|
|
|
|
|
|
|
Stat.NET_BB_PER_100_HANDS, |
|
|
|
|
|
|
|
Stat.HOURLY_RATE_BB, |
|
|
|
|
|
|
|
Stat.AVERAGE, |
|
|
|
|
|
|
|
Stat.STANDARD_DEVIATION_HOURLY, |
|
|
|
|
|
|
|
Stat.WIN_RATIO, |
|
|
|
|
|
|
|
Stat.NUMBER_OF_GAMES, |
|
|
|
|
|
|
|
Stat.AVERAGE_BUYIN |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
val cgSessionGroup = ComputableGroup(stringCashGame, listOf(QueryCondition.CASH), cgStats) |
|
|
|
|
|
|
|
val tStats: List<Stat> = |
|
|
|
|
|
|
|
listOf(Stat.NETRESULT, Stat.HOURLY_RATE, Stat.ROI, Stat.WIN_RATIO, Stat.NUMBER_OF_GAMES, Stat.AVERAGE_BUYIN) |
|
|
|
|
|
|
|
val tSessionGroup = ComputableGroup(stringTournament, listOf(QueryCondition.TOURNAMENT), tStats) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Timber.d(">>>>> Start computations...") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Calculator.computeGroups( |
|
|
|
|
|
|
|
realm, |
|
|
|
|
|
|
|
listOf(allSessionGroup, cgSessionGroup, tSessionGroup), |
|
|
|
|
|
|
|
Calculator.Options() |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private fun showResults(report: Report) { |
|
|
|
private fun showResults(report: Report) { |
|
|
|
this.rowRepresentables = this.convertReportIntoRepresentables(report) |
|
|
|
this.rowRepresentables = this.convertReportIntoRepresentables(report) |
|
|
|
statsAdapter.notifyDataSetChanged() |
|
|
|
statsAdapter.notifyDataSetChanged() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private fun convertReportIntoRepresentables(report: Report) : ArrayList<RowRepresentable> { |
|
|
|
private fun convertReportIntoRepresentables(report: Report): ArrayList<RowRepresentable> { |
|
|
|
|
|
|
|
|
|
|
|
val rows: ArrayList<RowRepresentable> = ArrayList() |
|
|
|
val rows: ArrayList<RowRepresentable> = ArrayList() |
|
|
|
|
|
|
|
|
|
|
|
report.results.forEach { result -> |
|
|
|
report.results.forEach { result -> |
|
|
|
rows.add(CustomizableRowRepresentable(title = result.group.name)) |
|
|
|
rows.add(CustomizableRowRepresentable(title = result.group.name)) |
|
|
|
result.group.stats?.forEach { stat -> |
|
|
|
result.group.stats?.forEach { stat -> |
|
|
|
rows.add(StatRepresentable(stat, result.computedStat(stat), result.group.name)) |
|
|
|
rows.add(StatRepresentable(stat, result.computedStat(stat), result.group.name)) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return rows |
|
|
|
return rows |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// RowRepresentableDelegate |
|
|
|
// RowRepresentableDelegate |
|
|
|
|
|
|
|
|
|
|
|
@ -223,10 +245,14 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc |
|
|
|
Timber.d(">>> start...") |
|
|
|
Timber.d(">>> start...") |
|
|
|
|
|
|
|
|
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
val options = Calculator.Options() |
|
|
|
// val options = Calculator.Options() |
|
|
|
options.evolutionValues = Calculator.Options.EvolutionValues.STANDARD |
|
|
|
// options.evolutionValues = Calculator.Options.EvolutionValues.STANDARD |
|
|
|
options.displayedStats = listOf(stat) |
|
|
|
// options.displayedStats = listOf(stat) |
|
|
|
report = Calculator.computeGroups(realm, listOf(computableGroup), options) |
|
|
|
|
|
|
|
|
|
|
|
val aggregationType = stat.aggregationTypes.first() |
|
|
|
|
|
|
|
report = Calculator.computeStatsWithEvolutionByAggregationType(realm, computableGroup, aggregationType) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// report = Calculator.computeGroups(realm, listOf(computableGroup), options) |
|
|
|
realm.close() |
|
|
|
realm.close() |
|
|
|
|
|
|
|
|
|
|
|
val e = Date() |
|
|
|
val e = Date() |
|
|
|
|