Merge branch 'dev'

feature/top10
Laurent 7 years ago
commit b824aa9aaf
  1. 2
      app/build.gradle
  2. 8
      app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/BlindFilterInstrumentedTest.kt
  3. 14
      app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/DateFilterInstrumentedUnitTest.kt
  4. 100
      app/src/androidTest/java/net/pokeranalytics/android/unitTests/filter/SessionFilterInstrumentedUnitTest.kt
  5. 220
      app/src/main/AndroidManifest.xml
  6. 4
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  7. 1
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  8. 4
      app/src/main/java/net/pokeranalytics/android/calculus/Report.kt
  9. 44
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  10. 7
      app/src/main/java/net/pokeranalytics/android/model/migrations/Patcher.kt
  11. 13
      app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
  12. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  13. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/FilterCondition.kt
  14. 23
      app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt
  15. 11
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  16. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt
  17. 3
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt
  18. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt
  19. 18
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt
  20. 19
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt
  21. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.png
  22. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.png
  23. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.png
  24. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  25. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.png

@ -28,7 +28,7 @@ android {
applicationId "net.pokeranalytics.android"
minSdkVersion 23
targetSdkVersion 28
versionCode 21
versionCode 19
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

@ -49,7 +49,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
blind.filterSectionRow = FilterSectionRow.BLIND
val filterElement = FilterCondition(filterElementRows = arrayListOf(blind))
filter.updateValueMap(filterElement)
filter.updateValueBy(filterElement)
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -100,7 +100,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
blind2.filterSectionRow = FilterSectionRow.BLIND
val filterElements = FilterCondition(filterElementRows = arrayListOf(blind1, blind2))
filter.updateValueMap(filterElements)
filter.updateValueBy(filterElements)
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -148,7 +148,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
blind.filterSectionRow = FilterSectionRow.BLIND
val filterElement = FilterCondition(filterElementRows = arrayListOf(blind))
filter.updateValueMap(filterElement)
filter.updateValueBy(filterElement)
println("<<<< ${filter.listOfValues}")
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -200,7 +200,7 @@ class BlindFilterInstrumentedTest : BaseFilterInstrumentedUnitTest() {
blind2.filterSectionRow = FilterSectionRow.BLIND
val filterElement = FilterCondition(filterElementRows = arrayListOf(blind1, blind2))
filter.updateValueMap(filterElement)
filter.updateValueBy(filterElement)
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))

@ -35,7 +35,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filterElementRow = QueryCondition.AnyDayOfWeek().apply { listOfValues = arrayListOf(cal.get(Calendar.DAY_OF_WEEK)) }
filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE
val filterElement = FilterCondition(arrayListOf(filterElementRow))
filter.updateValueMap(filterElement)
filter.updateValueBy(filterElement)
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -64,7 +64,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE
val filterElement = FilterCondition(arrayListOf(filterElementRow))
filter.updateValueMap(filterElement)
filter.updateValueBy(filterElement)
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -92,7 +92,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filterElementRow = QueryCondition.AnyYear().apply { listOfValues = arrayListOf(cal.get(Calendar.YEAR)) }
filterElementRow.filterSectionRow = FilterSectionRow.DYNAMIC_DATE
val filterElement = FilterCondition(arrayListOf(filterElementRow))
filter.updateValueMap(filterElement)
filter.updateValueBy(filterElement)
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -385,7 +385,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.StartedFromDate()
val filterElementRow = QueryCondition.StartedFromDate().apply { singleValue = s2.startDate!!}
filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -413,7 +413,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.StartedToDate()
val filterElementRow = QueryCondition.StartedToDate().apply { singleValue = s1.startDate!! }
filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -442,7 +442,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.EndedFromDate()
val filterElementRow = QueryCondition.EndedFromDate().apply { singleValue = s2.endDate() }
filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -471,7 +471,7 @@ class DateFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.EndedToDate()
val filterElementRow = QueryCondition.EndedToDate().apply { singleValue = s1.endDate() }
filterElementRow.filterSectionRow = FilterSectionRow.FIXED_DATE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))

@ -110,7 +110,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.AnyBankroll()
val filterElementRow = QueryCondition.AnyBankroll().apply { setObject(b1) }
filterElementRow.filterSectionRow = FilterSectionRow.BANKROLL
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -144,7 +144,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filterElementRow2 = QueryCondition.AnyBankroll().apply { setObject(b2) }
filterElementRow2.filterSectionRow = FilterSectionRow.BANKROLL
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -225,7 +225,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.AnyLocation()
val filterElementRow = QueryCondition.AnyLocation().apply { setObject(l1) }
filterElementRow.filterSectionRow = FilterSectionRow.LOCATION
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -260,7 +260,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filterElementRow2 = QueryCondition.AnyLocation().apply { setObject(l3) }
filterElementRow2.filterSectionRow = FilterSectionRow.LOCATION
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -287,7 +287,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filterElementRow = QueryCondition.AnyTournamentName().apply { setObject(t1) }
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -320,7 +320,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME
val filterElementRow2 = QueryCondition.AnyTournamentName().apply { setObject(t2) }
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_NAME
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -358,7 +358,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
filterElementRow2.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
val filterElementRow3 = QueryCondition.AllTournamentFeature().apply { setObject(t4) }
filterElementRow3.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -395,7 +395,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
filterElementRow3.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
val filterElementRow4 = QueryCondition.AnyTournamentFeature().apply { setObject(t4) }
filterElementRow4.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3, filterElementRow4)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2, filterElementRow3, filterElementRow4)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -423,7 +423,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.AnyTournamentFeature()
val filterElementRow = QueryCondition.AnyTournamentFeature().apply { setObject(t2) }
filterElementRow.filterSectionRow = FilterSectionRow.TOURNAMENT_FEATURE
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -450,7 +450,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
filterElementRow.filterSectionRow = FilterSectionRow.TABLE_SIZE
val filterElementRow2 = QueryCondition.AnyTableSize().apply { listOfValues = arrayListOf(4) }
filterElementRow.filterSectionRow = FilterSectionRow.TABLE_SIZE
filter.updateValueMap(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
filter.updateValueBy(FilterCondition(filterElementRows = arrayListOf(filterElementRow, filterElementRow2)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -475,7 +475,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.NetAmountWon()
val filterElementRow = QueryCondition.more<QueryCondition.NetAmountWon>().apply { listOfValues = arrayListOf(204.0) }
filterElementRow.filterSectionRow = FilterSectionRow.VALUE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filterElementRow))
@ -500,7 +500,7 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filter = QueryCondition.NetAmountWon()
val filterElementRow = QueryCondition.less<QueryCondition.NetAmountWon>().apply { listOfValues = arrayListOf(540.0) }
filterElementRow.filterSectionRow = FilterSectionRow.VALUE
filter.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
filter.updateValueBy(FilterCondition(arrayListOf(filterElementRow)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filter))
@ -525,12 +525,12 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
val filterMore = QueryCondition.NetAmountWon()
val filterElementRow = QueryCondition.more<QueryCondition.NetAmountWon>().apply { listOfValues = arrayListOf(200.0) }
filterElementRow.filterSectionRow = FilterSectionRow.VALUE
filterMore.updateValueMap(FilterCondition(arrayListOf(filterElementRow)))
filterMore.updateValueBy(FilterCondition(arrayListOf(filterElementRow)))
val filterLess = QueryCondition.NetAmountWon()
val filterElementRow2 = QueryCondition.less<QueryCondition.NetAmountWon>().apply { listOfValues = arrayListOf(400.0) }
filterElementRow2.filterSectionRow = FilterSectionRow.VALUE
filterLess.updateValueMap(FilterCondition(arrayListOf(filterElementRow2)))
filterLess.updateValueBy(FilterCondition(arrayListOf(filterElementRow2)))
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filterMore, filterLess))
@ -541,4 +541,76 @@ class SessionFilterInstrumentedUnitTest : BaseFilterInstrumentedUnitTest() {
Assert.assertTrue(result.contains((it as Session).id))
}
}
@Test
fun testNumberOfRebuys() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = Session.testInstance(netResult = 200.0, isTournament = true)
s1.result!!.buyin = 50.0
s1.tournamentEntryFee = 10.0
val s2 = Session.testInstance(netResult = 50.0, isTournament = true)
s2.result!!.buyin = 10.0
s2.tournamentEntryFee = 10.0
val s3 = Session.testInstance(netResult = 500.0)
s3.cgBigBlind = 2.0
s3.result!!.buyin = 1000.0
val s4 = Session.testInstance(netResult = 570.0)
s4.cgBigBlind = 5.0
s4.result!!.buyin = 200.0
realm.commitTransaction()
val filterMore = QueryCondition.NumberOfRebuy(QueryCondition.Operator.MORE, 5.0)
val sessions = Filter.queryOn<Session>(realm, arrayListOf(filterMore))
Assert.assertEquals(2, sessions.size)
val result = arrayListOf(s1.id, s3.id)
sessions.forEach {
Assert.assertTrue(result.contains((it as Session).id))
}
}
@Test
fun testTournamentFinalPosition() {
val realm = this.mockRealm
realm.beginTransaction()
val s1 = Session.testInstance(netResult = 200.0, isTournament = true)
s1.result!!.tournamentFinalPosition = 5
val s2 = Session.testInstance(netResult = 50.0, isTournament = true)
s2.result!!.tournamentFinalPosition = 15
val s3 = Session.testInstance(netResult = 500.0, isTournament = true)
s3.result!!.tournamentFinalPosition = 2
val s4 = Session.testInstance(netResult = 570.0, isTournament = true)
s4.result!!.tournamentFinalPosition = 1
realm.commitTransaction()
val filterLess = QueryCondition.TournamentFinalPosition(QueryCondition.Operator.LESS, finalPosition = 1)
var sessions = Filter.queryOn<Session>(realm, arrayListOf(filterLess))
Assert.assertEquals(1, sessions.size)
var result = arrayListOf(s4.id)
sessions.forEach {
Assert.assertTrue(result.contains((it as Session).id))
}
val filterMore = QueryCondition.TournamentFinalPosition(QueryCondition.Operator.MORE, finalPosition = 10)
sessions = Filter.queryOn<Session>(realm, arrayListOf(filterMore))
Assert.assertEquals(1, sessions.size)
result = arrayListOf(s2.id)
sessions.forEach {
Assert.assertTrue(result.contains((it as Session).id))
}
}
}

@ -1,114 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.pokeranalytics.android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:name=".PokerAnalyticsApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/PokerAnalyticsTheme">
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
<activity
android:name="net.pokeranalytics.android.ui.activity.HomeActivity"
android:screenOrientation="portrait"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="net.pokeranalytics.android.ui.activity.SessionActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustNothing" />
<activity
android:name="net.pokeranalytics.android.ui.activity.BankrollActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.SettingsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.StatisticDetailsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.ReportDetailsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.CalendarDetailsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.ComparisonChartActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.DataListActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.EditableDataActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.CurrenciesActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.FiltersActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.FilterDetailsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.GDPRActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<meta-data
android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application>
package="net.pokeranalytics.android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:name=".PokerAnalyticsApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/PokerAnalyticsTheme">
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
<activity
android:name="net.pokeranalytics.android.ui.activity.HomeActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="net.pokeranalytics.android.ui.activity.SessionActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustNothing" />
<activity
android:name="net.pokeranalytics.android.ui.activity.BankrollActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.SettingsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.StatisticDetailsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.ReportDetailsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.CalendarDetailsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.ComparisonChartActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.DataListActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.EditableDataActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.CurrenciesActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.FiltersActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.FilterDetailsActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.GDPRActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<meta-data
android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application>
</manifest>

@ -30,7 +30,7 @@ class PokerAnalyticsApplication : Application() {
Realm.init(this)
val realmConfiguration = RealmConfiguration.Builder()
.name(Realm.DEFAULT_REALM_NAME)
.schemaVersion(3)
.schemaVersion(4)
.migration(PokerAnalyticsMigration())
.initialData(Seed(this))
.build()
@ -69,7 +69,7 @@ class PokerAnalyticsApplication : Application() {
if (sessionsCount < 10) {
GlobalScope.launch {
FakeDataManager.createFakeSessions(1)
FakeDataManager.createFakeSessions(200)
}
}

@ -6,7 +6,6 @@ import net.pokeranalytics.android.model.Criteria
import net.pokeranalytics.android.model.combined
import net.pokeranalytics.android.model.extensions.hourlyDuration
import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.filter.filter
import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.SessionSet

@ -401,7 +401,7 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu
return DataSetFactory.lineDataSetInstance(entries, stat.name, context)
}
fun barEntries(stat: Stat, context: Context): BarDataSet {
private fun barEntries(stat: Stat, context: Context): BarDataSet {
val entries = mutableListOf<BarEntry>()
this._evolutionValues[stat]?.let { points ->
@ -412,7 +412,7 @@ class ComputedResults(group: ComputableGroup, shouldManageMultiGroupProgressValu
return DataSetFactory.barDataSetInstance(entries, stat.name, context)
}
fun distributionEntries(stat: Stat, context: Context): BarDataSet {
private fun distributionEntries(stat: Stat, context: Context): BarDataSet {
val colors = mutableListOf<Int>()
val entries = mutableListOf<BarEntry>()

@ -129,8 +129,8 @@ sealed class QueryCondition : FilterElementRow {
open var sign: Int = 1
override var listOfValues = arrayListOf(0.0)
override fun updateValueMap(filterCondition: FilterCondition) {
super.updateValueMap(filterCondition)
override fun updateValueBy(filterCondition: FilterCondition) {
super.updateValueBy(filterCondition)
listOfValues = filterCondition.getValues()
}
override fun labelForValue(value: Double): String {
@ -140,9 +140,8 @@ sealed class QueryCondition : FilterElementRow {
abstract class ListOfInt: ListOfValues<Int>() {
override var listOfValues = arrayListOf(0)
override fun updateValueMap(filterCondition: FilterCondition) {
super.updateValueMap(filterCondition)
println("<<<< updateValueMap ${filterCondition.intValues}")
override fun updateValueBy(filterCondition: FilterCondition) {
super.updateValueBy(filterCondition)
listOfValues = filterCondition.getValues()
}
override fun labelForValue(value: Int): String {
@ -153,8 +152,8 @@ sealed class QueryCondition : FilterElementRow {
abstract class ListOfString: ListOfValues<String>() {
override var listOfValues = ArrayList<String>()
override fun labelForValue(value: String): String { return value }
override fun updateValueMap(filterCondition: FilterCondition) {
super.updateValueMap(filterCondition)
override fun updateValueBy(filterCondition: FilterCondition) {
super.updateValueBy(filterCondition)
listOfValues = filterCondition.getValues()
}
}
@ -168,8 +167,8 @@ sealed class QueryCondition : FilterElementRow {
get() { return listOfValues.firstOrNull() ?: Date() }
set(value) { listOfValues.add(value) }
override fun updateValueMap(filterCondition: FilterCondition) {
super.updateValueMap(filterCondition)
override fun updateValueBy(filterCondition: FilterCondition) {
super.updateValueBy(filterCondition)
singleValue = filterCondition.getValue()
}
}
@ -182,8 +181,8 @@ sealed class QueryCondition : FilterElementRow {
get() { return listOfValues.firstOrNull() ?: 0 }
set(value) { listOfValues.add(value) }
override fun updateValueMap(filterCondition: FilterCondition) {
super.updateValueMap(filterCondition)
override fun updateValueBy(filterCondition: FilterCondition) {
super.updateValueBy(filterCondition)
singleValue = filterCondition.getValue()
}
}
@ -316,10 +315,25 @@ sealed class QueryCondition : FilterElementRow {
class NumberOfTable: ListOfInt()
open class NetAmountWon: ListOfDouble()
class NetAmountLost: NetAmountWon() { override var sign: Int = -1 }
class NumberOfRebuy(): ListOfDouble() {
constructor(operator: Operator, numberOfRebuy: Double) : this() {
this.operator = operator
this.listOfValues = arrayListOf(numberOfRebuy)
}
}
open class TournamentFinalPosition(): ListOfInt() {
constructor(operator: Operator, finalPosition: Int) : this() {
this.operator = operator
this.listOfValues = arrayListOf(finalPosition)
}
}
open class NetAmount: ListOfDouble()
class NetAmountWon: NetAmount()
class NetAmountLost: NetAmount() { override var sign: Int = -1 }
class NumberOfPlayer: ListOfInt()
class TournamentNumberOfPlayer: ListOfInt()
class StartedFromDate: DateQuery() { override var operator = Operator.MORE }
class StartedToDate: DateQuery() { override var operator = Operator.LESS }
@ -514,7 +528,7 @@ sealed class QueryCondition : FilterElementRow {
}
}
open fun updateValueMap(filterCondition: FilterCondition) {
open fun updateValueBy(filterCondition: FilterCondition) {
filterCondition.operator?.let {
this.operator = Operator.values()[it]
}

@ -4,6 +4,7 @@ import io.realm.Realm
import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.model.realm.Result
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.SessionSet
@ -15,7 +16,8 @@ class Patcher {
val realm = Realm.getDefaultInstance()
val sets = realm.where(SessionSet::class.java).findAll()
val sessions = Filter.queryOn<Session>(realm, Query(QueryCondition.IsCash))
val sessions = Filter.queryOn<Session>(realm, Query(QueryCondition.IsCash))
val results = realm.where(Result::class.java).findAll()
realm.executeTransaction {
sets.forEach {
@ -23,6 +25,9 @@ class Patcher {
}
sessions.forEach {
it.formatBlinds()
}
results.forEach {
it.computeNumberOfRebuy()
}
}
realm.close()

@ -60,7 +60,9 @@ class PokerAnalyticsMigration : RealmMigration {
}
schema.get("Session")?.let {
it.addField("blinds", String::class.java)
it.addField("blinds", String::class.java).transform {
}
}
schema.get("FilterCondition")?.let {
@ -89,6 +91,15 @@ class PokerAnalyticsMigration : RealmMigration {
currentVersion++
}
// Migrate to version 3
if (currentVersion == 3) {
Timber.d("*** Running migration ${currentVersion + 1}")
schema.get("Result")?.let {
it.addField("numberOfRebuy", Double::class.java).setNullable("numberOfRebuy", true)
}
currentVersion++
}
}
override fun equals(other: Any?): Boolean {

@ -114,7 +114,7 @@ open class Filter : RealmObject() {
it.queryCondition.id == filterElementRow.id
}
if (filtered.isNotEmpty()) {
return filterElementRow.updateValueMap(filtered.first())
return filterElementRow.updateValueBy(filtered.first())
}
}

@ -33,7 +33,7 @@ open class FilterCondition() : RealmObject() {
val queryCondition : QueryCondition
get() = QueryCondition.valueOf<QueryCondition>(this.filterName ?: throw PokerAnalyticsException.FilterElementUnknownName)
.apply {
this.updateValueMap(this@FilterCondition)
this.updateValueBy(this@FilterCondition)
}
var doubleValues: RealmList<Double>? = null

@ -87,7 +87,7 @@ open class Result : RealmObject(), Filterable {
var tournamentFinalPosition: Int? = null
// Number of rebuys
//var numberOfRebuy: Double? = null
var numberOfRebuy: Double? = null
@LinkingObjects("result")
private val sessions: RealmResults<Session>? = null
@ -122,7 +122,26 @@ open class Result : RealmObject(), Filterable {
}
// Computes the number of rebuy
private fun computeNumberOfRebuy() {
fun computeNumberOfRebuy() {
this.session?.let {
if (it.isCashGame()) {
it.cgBigBlind?.let { bb ->
if (bb > 0.0) {
this.numberOfRebuy = (this.buyin ?: 0.0) / (bb * 100.0)
} else {
this.numberOfRebuy = null
}
}
} else {
it.tournamentEntryFee?.let { entryFee ->
if (entryFee > 0.0) {
this.numberOfRebuy = (this.buyin ?: 0.0) / entryFee
} else {
this.numberOfRebuy = null
}
}
}
}
}
// @todo tips?

@ -77,8 +77,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
AnyTournamentType::class.java -> "tournamentType"
AnyBlind::class.java -> "blinds"
NumberOfTable::class.java -> "numberOfTable"
NetAmountWon::class.java -> "computableResults.ratedNet"
NumberOfPlayer::class.java -> "tournamentNumberOfPlayers"
NetAmount::class.java -> "computableResults.ratedNet"
NumberOfRebuy::class.java -> "result.numberOfRebuy"
TournamentNumberOfPlayer::class.java -> "result.tournamentNumberOfPlayers"
TournamentFinalPosition::class.java -> "result.tournamentFinalPosition"
TournamentFee::class.java -> "tournamentEntryFee"
StartedFromDate::class.java, StartedToDate::class.java -> "startDate"
EndedFromDate::class.java, EndedToDate::class.java -> "endDate"
@ -222,6 +224,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
field = value
this.computeStats()
formatBlinds()
this.result?.computeNumberOfRebuy()
}
var blinds: String? = null
@ -231,6 +234,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
// The entry fee of the tournament
var tournamentEntryFee: Double? = null
set(value) {
field = value
this.result?.computeNumberOfRebuy()
}
// The total number of players who participated in the tournament
var tournamentNumberOfPlayers: Int? = null

@ -169,7 +169,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
rows.clear()
rows.add(SimpleRow.NAME)
rows.add(BankrollRow.LIVE)
// rows.add(BankrollRow.INITIAL_VALUE)
rows.add(BankrollRow.INITIAL_VALUE)
rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.currency))
rows.add(BankrollRow.CURRENCY)
if (this.shouldShowCurrencyRate) {

@ -122,7 +122,8 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
val requiredStats: List<Stat> = listOf(Stat.NET_RESULT)
val options = Calculator.Options(evolutionValues = Calculator.Options.EvolutionValues.STANDARD, stats = requiredStats)
val report = Calculator.computeStatsWithCriterias(realm, criterias = criteria, options = options)
val report = Calculator.computeStatsWithCriterias(realm, criteria, options = options)
// val report = Calculator.computeStatsWithComparators(realm, criteria = criteria, options = options)
Timber.d("launchComputation: ${System.currentTimeMillis() - startDate.time}ms")

@ -129,6 +129,7 @@ class StatisticDetailsFragment : PokerAnalyticsFragment() {
when (aggregationType) {
AggregationType.MONTH, AggregationType.YEAR -> {
if (aggregationType.criterias.combined().size < 2) {
Toast.makeText(context, R.string.less_then_2_values_for_display, Toast.LENGTH_LONG).show()
return

@ -14,10 +14,10 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In
TOURNAMENT(R.string.tournament),
ONLINE(R.string.online),
RESULT(R.string.result),
TRANSACTION_TYPES(R.string.operation_types),
//TRANSACTION_TYPES(R.string.operation_types),
LOCATIONS(R.string.locations),
BANKROLLS(R.string.bankrolls),
PLAYERS(R.string.players),
//PLAYERS(R.string.players),
;
val filterElements: List<RowRepresentable>
@ -61,8 +61,9 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In
TOURNAMENT_TYPE,
TOURNAMENT_NAME,
TOURNAMENT_FEATURE,
ENTRY_FEE,
NUMBER_OF_PLAYERS
TOURNAMENT_ENTRY_FEE,
TOURNAMENT_NUMBER_OF_PLAYER,
TOURNAMENT_FINAL_POSITION
)
ONLINE -> arrayListOf(
MULTI_TABLING
@ -70,14 +71,13 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In
LOCATIONS -> arrayListOf(
LOCATION
)
PLAYERS -> arrayListOf(
MULTI_PLAYER
)
//PLAYERS -> arrayListOf(MULTI_PLAYER)
RESULT -> arrayListOf(
VALUE
VALUE,
NUMBER_OF_REBUY
)
TRANSACTION_TYPES -> arrayListOf()
//TRANSACTION_TYPES -> arrayListOf()
}
}
}

@ -29,16 +29,17 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
TOURNAMENT_NAME(R.string.tournament_name),
TOURNAMENT_FEATURE(R.string.tournament_feature),
COMPLETION_PERCENTAGE(R.string.tournament_completion_percentage_interval),
PLACE(R.string.final_position),
PLAYERS_COUNT(R.string.players_count),
TOURNAMENT_FINAL_POSITION(R.string.final_position),
TOURNAMENT_NUMBER_OF_PLAYER(R.string.players_count),
TOURNAMENT_RE_BUY_COUNT(R.string.rebuy_count),
ENTRY_FEE(R.string.buyin),
MULTI_TABLING(R.string.multi_tabling),
TOURNAMENT_ENTRY_FEE(R.string.buyin),
MULTI_TABLING(R.string.number_of_tables),
VALUE(R.string.value),
LOCATION(R.string.locations),
BANKROLL(R.string.bankrolls),
NUMBER_OF_PLAYERS(R.string.number_of_players),
MULTI_PLAYER(R.string.multiplayer),
NUMBER_OF_REBUY(R.string.number_of_buyins)
;
private enum class SelectionType {
@ -94,17 +95,17 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
// Tournament
TOURNAMENT_TYPE -> Criteria.TournamentTypes.queryConditions.mapFirstCondition()
// COMPLETION_PERCENTAGE -> arrayListOf()
// PLACE -> QueryCondition.moreOrLess<QueryCondition.NumberOfPlayer>()
PLAYERS_COUNT -> QueryCondition.moreOrLess<QueryCondition.NumberOfPlayer>()
// TOURNAMENT_RE_BUY_COUNT -> QueryCondition.moreOrLess<QueryCondition.BuyIn>()
ENTRY_FEE -> Criteria.TournamentFees.queryConditions.mapFirstCondition()
TOURNAMENT_FINAL_POSITION -> QueryCondition.moreOrLess<QueryCondition.TournamentFinalPosition>()
TOURNAMENT_NUMBER_OF_PLAYER -> QueryCondition.moreOrLess<QueryCondition.TournamentNumberOfPlayer>()
TOURNAMENT_ENTRY_FEE -> Criteria.TournamentFees.queryConditions.mapFirstCondition()
TOURNAMENT_NAME -> Criteria.TournamentNames.queryConditions.mapFirstCondition()
TOURNAMENT_FEATURE -> Criteria.TournamentFeatures.queryConditions.mapFirstCondition()
LOCATION -> Criteria.Locations.queryConditions.mapFirstCondition()
BANKROLL -> Criteria.Bankrolls.queryConditions.mapFirstCondition()
MULTI_TABLING -> QueryCondition.moreOrLess<QueryCondition.NumberOfTable>()
// NUMBER_OF_PLAYERS -> QueryCondition.moreOrLess<QueryCondition.NumberOfPlayer>()
//NUMBER_OF_PLAYERS -> QueryCondition.moreOrLess<QueryCondition.TournamentNumberOfPlayer>()
NUMBER_OF_REBUY -> QueryCondition.moreOrLess<QueryCondition.NumberOfRebuy>()
// MULTI_PLAYER -> arrayListOf()
VALUE -> arrayListOf<QueryCondition>().apply {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Loading…
Cancel
Save