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

feature/top10
Razmig Sarkissian 7 years ago
commit 7bf44a6c61
  1. 3
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  2. 1
      app/src/main/java/net/pokeranalytics/android/calculus/Report.kt
  3. 15
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  4. 19
      app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/ui/adapter/HomePagerAdapter.kt
  6. 8
      app/src/main/java/net/pokeranalytics/android/ui/adapter/ReportPagerAdapter.kt
  7. 145
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
  8. 137
      app/src/main/java/net/pokeranalytics/android/ui/fragment/TableReportFragment.kt
  9. 15
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/StatRow.kt
  10. 3
      app/src/main/res/layout/fragment_evograph.xml

@ -116,7 +116,7 @@ class Calculator {
return when (aggregationType) { return when (aggregationType) {
AggregationType.SESSION, AggregationType.DURATION -> this.computeGroups(realm, listOf(group), options) AggregationType.SESSION, AggregationType.DURATION -> this.computeGroups(realm, listOf(group), options)
AggregationType.MONTH -> { AggregationType.MONTH -> {
val comparators: List<Comparator> = listOf(Comparator.YEAR, Comparator.MONTH_OF_YEAR) val comparators: List<Comparator> = listOf(Comparator.MONTH_OF_YEAR, Comparator.YEAR)
this.computeStatsWithComparators(realm, comparators, group.conditions, options) this.computeStatsWithComparators(realm, comparators, group.conditions, options)
} }
AggregationType.YEAR -> { AggregationType.YEAR -> {
@ -392,6 +392,7 @@ class Calculator {
results.addEvolutionValue(tHourlyRate, stat = HOURLY_RATE, data = sessionSet) results.addEvolutionValue(tHourlyRate, stat = HOURLY_RATE, data = sessionSet)
results.addEvolutionValue(tIndex.toDouble(), stat = NUMBER_OF_SETS, data = sessionSet) results.addEvolutionValue(tIndex.toDouble(), stat = NUMBER_OF_SETS, data = sessionSet)
results.addEvolutionValue( results.addEvolutionValue(
(sessionSet.startDate.time / 3600000).toDouble(),
sessionSet.netDuration.toDouble(), sessionSet.netDuration.toDouble(),
stat = DURATION, stat = DURATION,
data = sessionSet data = sessionSet

@ -342,6 +342,7 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu
return when (stat) { return when (stat) {
Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES -> this.barEntries(stat) Stat.NUMBER_OF_SETS, Stat.NUMBER_OF_GAMES -> this.barEntries(stat)
Stat.STANDARD_DEVIATION -> this.distributionEntries(stat, context) Stat.STANDARD_DEVIATION -> this.distributionEntries(stat, context)
Stat.DURATION -> this.barEntries(stat)
else -> this.singleLineEntries(stat, context) else -> this.singleLineEntries(stat, context)
} }
} }

@ -1,23 +1,20 @@
package net.pokeranalytics.android.model.filter package net.pokeranalytics.android.model.filter
import android.content.Context import io.realm.Realm
import io.realm.*
import io.realm.kotlin.where
import io.realm.RealmQuery import io.realm.RealmQuery
import io.realm.internal.Table import io.realm.RealmResults
import net.pokeranalytics.android.R import io.realm.Sort
import net.pokeranalytics.android.calculus.Stat import io.realm.kotlin.where
import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TableSize
import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.extensions.endOfDay import net.pokeranalytics.android.util.extensions.endOfDay
import net.pokeranalytics.android.util.extensions.startOfDay import net.pokeranalytics.android.util.extensions.startOfDay
@ -26,7 +23,7 @@ import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
fun List<QueryCondition>.name() : String { fun List<QueryCondition>.name() : String {
return this.map { it.getDisplayName() }.joinToString(" / ") return this.map { it.getDisplayName() }.joinToString(" : ")
} }
//inline fun <reified T : Filterable> List<QueryCondition>.query(realm: Realm): RealmQuery<T> { //inline fun <reified T : Filterable> List<QueryCondition>.query(realm: Realm): RealmQuery<T> {

@ -6,7 +6,9 @@ import android.view.ViewGroup
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter import androidx.fragment.app.FragmentStatePagerAdapter
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.* import net.pokeranalytics.android.ui.fragment.CalendarFragment
import net.pokeranalytics.android.ui.fragment.GraphFragment
import net.pokeranalytics.android.ui.fragment.HistoryFragment
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@ -51,20 +53,7 @@ class ComparisonChartPagerAdapter(val context: Context, fragmentManager: Fragmen
} }
override fun getItemPosition(obj: Any): Int { override fun getItemPosition(obj: Any): Int {
return when (obj) { return POSITION_UNCHANGED
//CLEAN
/*
HistoryFragment::class.java -> 0
StatsFragment::class.java -> 1
SettingsFragment::class.java -> 2
*/
HistoryFragment::class.java -> 0
StatsFragment::class.java -> 1
CalendarFragment::class.java -> 2
ReportsFragment::class.java -> 3
MoreFragment::class.java -> 4
else -> -1
}
} }
/** /**

@ -18,7 +18,7 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda
override fun getItem(position: Int): PokerAnalyticsFragment { override fun getItem(position: Int): PokerAnalyticsFragment {
return when (position) { return when (position) {
0 -> HistoryFragment.newInstance() 0 -> HistoryFragment.newInstance()
1 -> StatsFragment.newInstance() 1 -> StatisticsFragment.newInstance()
2 -> CalendarFragment.newInstance() 2 -> CalendarFragment.newInstance()
3 -> ReportsFragment.newInstance() 3 -> ReportsFragment.newInstance()
4 -> MoreFragment.newInstance() 4 -> MoreFragment.newInstance()
@ -44,7 +44,7 @@ class HomePagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAda
override fun getItemPosition(obj: Any): Int { override fun getItemPosition(obj: Any): Int {
return when (obj) { return when (obj) {
HistoryFragment::class.java -> 0 HistoryFragment::class.java -> 0
StatsFragment::class.java -> 1 StatisticsFragment::class.java -> 1
CalendarFragment::class.java -> 2 CalendarFragment::class.java -> 2
ReportsFragment::class.java -> 3 ReportsFragment::class.java -> 3
MoreFragment::class.java -> 4 MoreFragment::class.java -> 4

@ -9,6 +9,7 @@ import androidx.viewpager.widget.PagerAdapter
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Report import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.fragment.GraphFragment
import net.pokeranalytics.android.ui.fragment.TableReportFragment
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@ -26,14 +27,11 @@ class ReportPagerAdapter(val context: Context, val fragmentManager: FragmentMana
GraphFragment.newInstance(dataSetList) GraphFragment.newInstance(dataSetList)
} }
1 -> { 1 -> {
val dataSetList = listOf(report.lineEntries(context = context)) val dataSetList = report.multiLineEntries(context = context)
GraphFragment.newInstance(dataSetList) GraphFragment.newInstance(dataSetList)
PokerAnalyticsFragment()
} }
2 -> { 2 -> {
//val dataSetList = listOf(report.barEntries()) TableReportFragment.newInstance(report)
//GraphFragment.newInstance(dataSetList)
PokerAnalyticsFragment()
} }
else -> PokerAnalyticsFragment() else -> PokerAnalyticsFragment()
} }

@ -0,0 +1,145 @@
package net.pokeranalytics.android.ui.fragment
import android.os.Bundle
import android.view.View
import io.realm.Realm
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Calculator
import net.pokeranalytics.android.calculus.ComputableGroup
import net.pokeranalytics.android.calculus.Report
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.StatRow
import timber.log.Timber
import java.util.*
import kotlin.coroutines.CoroutineContext
class StatisticsFragment : TableReportFragment() {
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main
private var stringAll = ""
private var stringCashGame = ""
private var stringTournament = ""
companion object {
/**
* Create new instance
*/
fun newInstance(report: Report? = null): StatisticsFragment {
val fragment = StatisticsFragment()
report?.let {
fragment.report = it
}
val bundle = Bundle()
fragment.arguments = bundle
return fragment
}
}
// Life Cycle
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
launchStatComputation()
}
override fun sessionsChanged() {
this.launchStatComputation()
this.statsAdapter?.notifyDataSetChanged()
}
override fun initData() {
super.initData()
this.stringAll = getString(R.string.all)
this.stringCashGame = getString(R.string.cash_game)
this.stringTournament = getString(R.string.tournament)
}
override fun convertReportIntoRepresentables(report: Report): ArrayList<RowRepresentable> {
val rows: ArrayList<RowRepresentable> = ArrayList()
report.results.forEach { result ->
rows.add(CustomizableRowRepresentable(title = result.group.name))
result.group.stats?.forEach { stat ->
rows.add(StatRow(stat, result.computedStat(stat), result.group.name))
}
}
return rows
}
// Business
/**
* Launch stat computation
*/
private fun launchStatComputation() {
GlobalScope.launch(coroutineContext) {
val test = GlobalScope.async {
val s = Date()
Timber.d(">>> start...")
val realm = Realm.getDefaultInstance()
report = createSessionGroupsAndStartCompute(realm)
realm.close()
val e = Date()
val duration = (e.time - s.time) / 1000.0
Timber.d(">>> ended in $duration seconds")
}
test.await()
if (!isDetached) {
showResults()
}
}
}
/**
* Create session groups and start computations
*/
private fun createSessionGroupsAndStartCompute(realm: Realm): Report {
val allStats: List<Stat> = listOf(
Stat.NET_RESULT,
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.NET_RESULT,
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.NET_RESULT, 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())
}
}

@ -10,7 +10,6 @@ import kotlinx.android.synthetic.main.fragment_stats.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity
import net.pokeranalytics.android.ui.adapter.DisplayDescriptor import net.pokeranalytics.android.ui.adapter.DisplayDescriptor
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
@ -25,27 +24,27 @@ import timber.log.Timber
import java.util.* import java.util.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource, CoroutineScope, open class TableReportFragment : 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 stringCashGame = ""
private var stringTournament = ""
private lateinit var statsAdapter: RowRepresentableAdapter var statsAdapter: RowRepresentableAdapter? = null
private var report : Report? = null var report : Report? = null
companion object { companion object {
/** /**
* Create new instance * Create new instance
*/ */
fun newInstance(): StatsFragment { fun newInstance(report: Report? = null): TableReportFragment {
val fragment = StatsFragment() val fragment = TableReportFragment()
report?.let {
fragment.report = it
}
val bundle = Bundle() val bundle = Bundle()
fragment.arguments = bundle fragment.arguments = bundle
return fragment return fragment
@ -62,7 +61,10 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initData() initData()
initUI() initUI()
launchStatComputation()
report?.let {
showResults()
}
} }
// Row Representable DS // Row Representable DS
@ -75,7 +77,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
val dc = DisplayDescriptor() val dc = DisplayDescriptor()
dc.textFormat = TextFormat(NULL_TEXT) dc.textFormat = TextFormat(NULL_TEXT)
if (row is StatRow) { if (row is StatRow) {
context?.let { context -> context?.let { _ ->
row.computedStat?.let { row.computedStat?.let {
dc.textFormat = it.format() dc.textFormat = it.format()
} }
@ -86,7 +88,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
override fun statFormatForRow(row: RowRepresentable): TextFormat { override fun statFormatForRow(row: RowRepresentable): TextFormat {
if (row is StatRow) { if (row is StatRow) {
context?.let { context -> context?.let { _ ->
row.computedStat?.let { return it.format() } row.computedStat?.let { return it.format() }
} }
} }
@ -95,14 +97,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
statsAdapter.notifyDataSetChanged() statsAdapter?.notifyDataSetChanged()
}
// Override
override fun sessionsChanged() {
this.launchStatComputation()
this.statsAdapter.notifyDataSetChanged()
} }
// Business // Business
@ -110,22 +105,15 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
/** /**
* Init data * Init data
*/ */
private fun initData() { open fun initData() {
this.stringAll = getString(R.string.all)
this.stringCashGame = getString(R.string.cash_game)
this.stringTournament = getString(R.string.tournament)
this.statsAdapter = RowRepresentableAdapter(this, this) this.statsAdapter = RowRepresentableAdapter(this, this)
} }
/** /**
* Init UI * Init UI
*/ */
private fun initUI() { open fun initUI() {
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
recyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager layoutManager = viewManager
@ -133,87 +121,26 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
} }
} }
private fun launchStatComputation() { /**
* Show results
GlobalScope.launch(coroutineContext) { */
fun showResults() {
val test = GlobalScope.async {
val s = Date()
Timber.d(">>> start...")
val realm = Realm.getDefaultInstance()
report = createSessionGroupsAndStartCompute(realm)
realm.close()
val e = Date()
val duration = (e.time - s.time) / 1000.0
Timber.d(">>> ended in $duration seconds")
}
test.await()
if (!isDetached) {
showResults()
}
}
}
private fun createSessionGroupsAndStartCompute(realm: Realm): Report {
val allStats: List<Stat> = listOf(
Stat.NET_RESULT,
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.NET_RESULT,
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.NET_RESULT, 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?.let { report?.let {
this.rowRepresentables = this.convertReportIntoRepresentables(it) this.rowRepresentables = this.convertReportIntoRepresentables(it)
statsAdapter.notifyDataSetChanged() statsAdapter?.notifyDataSetChanged()
} }
} }
private fun convertReportIntoRepresentables(report: Report): ArrayList<RowRepresentable> { open fun convertReportIntoRepresentables(report: Report): ArrayList<RowRepresentable> {
val rows: ArrayList<RowRepresentable> = ArrayList() val rows: ArrayList<RowRepresentable> = ArrayList()
report.options.displayedStats.forEach {stat ->
rows.add(CustomizableRowRepresentable(title = stat.localizedTitle(requireContext())))
report.results.forEach {
val title = it.group.name
rows.add(StatRow(stat, it.computedStat(stat), it.group.name, title))
}
report.results.forEach { result -> }
rows.add(CustomizableRowRepresentable(title = result.group.name))
result.group.stats?.forEach { stat ->
rows.add(StatRow(stat, result.computedStat(stat), result.group.name))
}
}
return rows return rows
} }
@ -237,6 +164,8 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
private fun launchStatComputationWithEvolution(stat: Stat, computableGroup: ComputableGroup) { private fun launchStatComputationWithEvolution(stat: Stat, computableGroup: ComputableGroup) {
showLoader()
GlobalScope.launch(coroutineContext) { GlobalScope.launch(coroutineContext) {
var report: Report? = null var report: Report? = null
@ -259,12 +188,12 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
test.await() test.await()
if (!isDetached) { if (!isDetached) {
hideLoader()
report?.let { report?.let {
StatisticDetailsActivity.newInstance(requireContext(), stat, computableGroup, it) StatisticDetailsActivity.newInstance(requireContext(), stat, computableGroup, it)
} }
} }
} }
} }
} }

@ -1,12 +1,13 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import android.content.Context
import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
class StatRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "") : RowRepresentable { class StatRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "", var title: String? = null) : RowRepresentable {
var stat: Stat = stat var stat: Stat = stat
var computedStat: ComputedStat? = computedStat var computedStat: ComputedStat? = computedStat
@ -18,4 +19,16 @@ class StatRow(stat: Stat, computedStat: ComputedStat?, groupName: String = "") :
override val resId: Int? override val resId: Int?
get() = this.stat.resId get() = this.stat.resId
override fun localizedTitle(context: Context): String {
this.title?.let {
return it
}
this.resId?.let {
return context.getString(it)
}
return "LOCALISATION NOT FOUND"
}
} }

@ -17,8 +17,7 @@
android:id="@+id/chartContainer" android:id="@+id/chartContainer"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginTop="8dp" android:layout_margin="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

Loading…
Cancel
Save