merge conflict fix

feature/top10
Razmig Sarkissian 7 years ago
commit f9c1c2cb8a
  1. 47
      .gitlab-ci.yml
  2. 3
      app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt
  3. 18
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  4. 4
      app/src/main/java/net/pokeranalytics/android/calculus/bankroll/BankrollCalculator.kt
  5. 11
      app/src/main/java/net/pokeranalytics/android/model/realm/ComputableResult.kt
  6. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Currency.kt
  7. 22
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  8. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt
  9. 6
      app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt
  10. 2
      app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt
  11. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDataFragment.kt
  12. 25
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt
  13. 7
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  14. 15
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
  15. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/SessionObserverFragment.kt
  16. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt
  17. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt
  18. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt
  19. 21
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt
  20. 3
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSection.kt

@ -1,44 +1,21 @@
image: openjdk:8-jdk
image: jangrewe/gitlab-ci-android
variables:
ANDROID_COMPILE_SDK: "28"
ANDROID_BUILD_TOOLS: "28.0.3"
ANDROID_SDK_TOOLS: "4333796"
stages:
- build
before_script:
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
- unzip -d android-sdk-linux android-sdk.zip
- echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
- export ANDROID_HOME=$PWD/android-sdk-linux
- export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
- chmod +x ./gradlew
# temporarily disable checking for EPIPE error and use yes to accept all licenses
- set +o pipefail
- yes | android-sdk-linux/tools/bin/sdkmanager --licenses
- set -o pipefail
- export GRADLE_USER_HOME=$(pwd)/.gradle
- chmod +x ./gradlew
stages:
- build
- test
cache:
key: ${CI_PROJECT_ID}
paths:
- .gradle/
lintDebug:
build:
stage: build
script:
- ./gradlew -Pci --console=plain :app:lintDebug -PbuildDir=lint
assembleDebug:
stage: build
script:
- ./gradlew assembleDebug
- ./gradlew assembleDebug
artifacts:
paths:
- app/build/outputs/
unitTests:
stage: test
script:
- ./gradlew -Pci --console=plain :app:testDebug
- app/build/outputs/apk/app-debug.apk

@ -18,7 +18,8 @@ open class RealmInstrumentedUnitTest {
fun newSessionInstance(realm: Realm) : Session {
val session = realm.createObject(Session::class.java, UUID.randomUUID().toString())
session.computableResult = realm.createObject(ComputableResult::class.java)
val computableResult = realm.createObject(ComputableResult::class.java)
computableResult.session = session
session.result = realm.createObject(Result::class.java)
return session
}

@ -58,10 +58,10 @@ class Calculator {
companion object {
fun computePreAggregation(sets: List<SessionSet>, options: Options): List<ComputedResults> {
Timber.d("sets = ${sets.size}")
return listOf()
}
// fun computePreAggregation(sets: List<SessionSet>, options: Options): List<ComputedResults> {
// Timber.d("sets = ${sets.size}")
// return listOf()
// }
/**
* Computes all stats for list of Session sessionGroup
@ -168,6 +168,9 @@ class Calculator {
}
}
else -> {
// nothing
}
}
val sessionSets = computableGroup.sets
@ -190,8 +193,8 @@ class Calculator {
var tSum = 0.0
var tTotalHands = 0.0
var tBBSum = 0.0
var tHourlyRate = 0.0
var tHourlyRateBB = 0.0
var tHourlyRate: Double = 0.0
var tHourlyRateBB: Double = 0.0
sessionSets.forEach { sessionSet ->
tIndex++
@ -219,6 +222,9 @@ class Calculator {
}
}
}
else -> {
// nothing
}
}
var average = 0.0

@ -18,14 +18,14 @@ class BankrollCalculator {
if (setup.bankroll != null) {
sessionQuery.equalTo("bankroll.id", setup.bankroll.id)
}
val sessions = sessionQuery.findAll()
// val sessions = sessionQuery.findAll()
val transactionQuery = realm.where(Transaction::class.java)
if (setup.bankroll != null) {
transactionQuery.equalTo("bankroll.id", setup.bankroll.id).findAll()
}
val transactions = transactionQuery.findAll()
val sessionsNet = sessions.sum("result.net")
// val sessionsNet = sessions.sum("result.net")
val transactionsNet = transactions.sum("value")
transactions.forEach {

@ -1,9 +1,6 @@
package net.pokeranalytics.android.model.realm
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.Ignore
import io.realm.annotations.LinkingObjects
import net.pokeranalytics.android.calculus.interfaces.Computable
open class ComputableResult : RealmObject(), Computable {
@ -24,11 +21,11 @@ open class ComputableResult : RealmObject(), Computable {
override var sessionSet: SessionSet? = null
@LinkingObjects("computableResult")
private val sessions: RealmResults<Session>? = null
// @LinkingObjects("computableResult")
// private val sessions: RealmResults<Session>? = null
@Ignore
val session: Session? = this.sessions?.firstOrNull()
// @Ignore
var session: Session? = null
fun updateWith(session: Session) {

@ -27,7 +27,7 @@ open class Currency : RealmObject() {
// could be async
val query = this.realm.where(ComputableResult::class.java)
query.`in`("sessions.bankroll.currency.id", arrayOf(this.id))
query.`in`("session.bankroll.currency.id", arrayOf(this.id))
val cResults = query.findAll()
cResults.forEach { computable ->

@ -4,8 +4,10 @@ import android.content.Context
import io.realm.Realm
import io.realm.RealmList
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.Ignore
import io.realm.annotations.Index
import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where
import net.pokeranalytics.android.R
@ -61,7 +63,10 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
fun newInstance(realm: Realm, isTournament: Boolean, bankroll: Bankroll? = null): Session {
val session = Session()
session.result = Result()
session.computableResult = ComputableResult()
val computableResult = ComputableResult()
computableResult.session = session
if (bankroll != null) {
session.bankroll = bankroll
} else {
@ -78,6 +83,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
/**
* Indicates the type of session, cash game or tournament
*/
@Index
var type: Int = Type.CASH_GAME.ordinal
// The result of the main user
@ -86,7 +92,13 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
/**
* Optimized result for faster stats
*/
var computableResult: ComputableResult? = null
// var computableResult: ComputableResult? = null
@LinkingObjects("session")
private val computableResults: RealmResults<ComputableResult>? = null
@Ignore
val computableResult: ComputableResult? = this.computableResults?.firstOrNull()
// Timed interface
@ -293,10 +305,11 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
}
fun updateComputableResult() {
this.computableResult?.let {
this.computableResults?.forEach {
it.updateWith(this)
} ?: run {
throw IllegalStateException("Session should always have a Light Result")
throw IllegalStateException("Session should always have a computable results")
}
}
@ -497,6 +510,7 @@ open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource
// cleanup unnecessary related objects
set.deleteFromRealm()
this.result?.deleteFromRealm()
this.computableResults?.deleteAllFromRealm()
// Updates the timeline
SessionSetManager.removeFromTimeline(this)

@ -57,7 +57,7 @@ open class SessionSet : RealmObject(), Timed {
}
fun computeStats() {
this.ratedNet = this.sessions?.sumByDouble { it.computableResult!!.ratedNet } ?: 0.0
this.ratedNet = this.sessions?.sumByDouble { it.computableResult?.ratedNet ?: 0.0 } ?: 0.0
this.estimatedHands = this.sessions?.sumByDouble { it.estimatedHands } ?: 0.0
this.bbNetResult = this.sessions?.sumByDouble { it.bbNetResult } ?: 0.0
}

@ -125,9 +125,9 @@ class SessionSetManager {
session.sessionSet = set
// Add all orphan endedSessions
sessions.forEach { session ->
session.sessionSet = set
set.breakDuration = max(set.breakDuration, session.breakDuration)
sessions.forEach { s ->
s.sessionSet = set
set.breakDuration = max(set.breakDuration, s.breakDuration)
}
set.computeStats()

@ -152,7 +152,7 @@ class HomeActivity : PokerAnalyticsActivity() {
}
}
.setNegativeButton(R.string.cancel) {dialog, which ->
.setNegativeButton(R.string.cancel) { _, which ->
Timber.d("Click on cancel")
}

@ -111,7 +111,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) {
BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollDataFragment, BankrollDataFragment.REQUEST_CODE_CURRENCY)
BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollDataFragment, REQUEST_CODE_CURRENCY)
BankrollRow.REFRESH_RATE -> refreshRate()
else -> super.onRowSelected(position, row, fromAction)
}
@ -197,7 +197,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
override fun onResponse(call: Call<Map<String, CurrencyConverterValue>>, response: Response<Map<String, CurrencyConverterValue>>) {
response.body()?.let {
it[currenciesConverterValue]?.value?.let {rate ->
it[currenciesConverterValue]?.value?.let { rate ->
onRowValueChanged(rate.toString(), BankrollRow.RATE)
}
}

@ -15,12 +15,15 @@ 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.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.helpers.DateTimePickerManager
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategory
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElement
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSection
import timber.log.Timber
import java.util.*
open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate {
@ -77,6 +80,22 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta
selectedRows.add(row)
}
}
/*
Timber.d("Row: $row")
when (row) {
FilterRow.FROM -> DateTimePickerManager.create(requireContext(), row, this, Date(), onlyDate = true)
FilterRow.TO -> DateTimePickerManager.create(requireContext(), row, this, Date(), onlyDate = true)
FilterRow.PAST_DAYS -> {
val data = row.editingDescriptors(mapOf("defaultValue" to ""))
BottomSheetFragment.create(fragmentManager, row, this, data, null)
}
else -> {
selectedRows.add(row)
}
}
}
*/
rowRepresentableAdapter.refreshRow(row)
}
@ -84,6 +103,12 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta
return selectedRows.contains(row)
}
override fun onRowValueChanged(value: Any?, row: RowRepresentable) {
super.onRowValueChanged(value, row)
selectedRows.add(row as FilterElement)
rowRepresentableAdapter.refreshRow(row)
}
override fun adapterRows(): List<RowRepresentable>? {
return rows
}

@ -86,12 +86,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate {
val data = currentSession.editDescriptors(row)
when (row) {
SessionRow.START_DATE -> DateTimePickerManager.create(
requireContext(),
row,
this,
currentSession.startDate
)
SessionRow.START_DATE -> DateTimePickerManager.create(requireContext(),row,this,currentSession.startDate)
SessionRow.END_DATE -> DateTimePickerManager.create(
requireContext(),
row,

@ -166,25 +166,16 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
val s = Date()
val allSessions = realm.where(ComputableResult::class.java).isNotNull("sessions.endDate").findAll()
val allSessions = realm.where(ComputableResult::class.java).isNotNull("session.endDate").findAll()
val allSessionSets = realm.where(SessionSet::class.java).findAll()
Timber.d(">>>>> number of computables to compute = ${allSessions.size}")
val cgSessions = allSessions.where().equalTo("sessions.type", Session.Type.CASH_GAME.ordinal).findAll()
val cgSessions = allSessions.where().equalTo("session.type", Session.Type.CASH_GAME.ordinal).findAll()
val cgSessionSets = realm.where(SessionSet::class.java).equalTo("sessions.type", Session.Type.CASH_GAME.ordinal).findAll()
val tSessions = allSessions.where().equalTo("sessions.type", Session.Type.TOURNAMENT.ordinal).findAll()
val tSessions = allSessions.where().equalTo("session.type", Session.Type.TOURNAMENT.ordinal).findAll()
val tSessionSets = realm.where(SessionSet::class.java).equalTo("sessions.type", Session.Type.TOURNAMENT.ordinal).findAll()
// val computableList = realm.copyFromRealm(allSessions)
// computableList.forEach { session ->
// if (true) { // @todo
// cgSessions.add(session)
// } else {
// tSessions.add(session)
// }
// }
val e = Date()
val duration = (e.time - s.time) / 1000.0
Timber.d(">>> filtering in ${duration} seconds")

@ -10,7 +10,7 @@ open class SessionObserverFragment : PokerAnalyticsFragment() {
init {
val realm = Realm.getDefaultInstance()
this.endedSessions = realm.where(ComputableResult::class.java).isNotNull("sessions.endDate").findAll()
this.endedSessions = realm.where(ComputableResult::class.java).isNotNull("session.endDate").findAll()
this.endedSessions.addChangeListener { _, _ ->
this.sessionsChanged()
}

@ -88,7 +88,7 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() {
}
editText2.setOnEditorActionListener { v, actionId, _ ->
editText2.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
this.delegate.onRowValueChanged(values, row)
dismiss()

@ -53,7 +53,7 @@ class BottomSheetEditTextFragment : BottomSheetFragment() {
editText1.addTextChangedListener { value = it?.toString() ?: "" }
editText1.setText((data[0].defaultValue ?: "").toString())
editText1.setOnEditorActionListener { v, actionId, _ ->
editText1.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
delegate.onRowValueChanged(getValue(), row)
dismiss()

@ -117,7 +117,7 @@ class BottomSheetSumFragment : BottomSheetFragment() {
}
}
editText2.setOnEditorActionListener { v, actionId, _ ->
editText2.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
this.delegate.onRowValueChanged(value, row)
dismiss()

@ -1,9 +1,11 @@
package net.pokeranalytics.android.ui.view.rowrepresentable
import io.realm.Realm
import android.text.InputType
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType
import java.lang.Exception
import java.util.*
@ -93,4 +95,23 @@ sealed class FilterElement : RowRepresentable {
return null
}
/*
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? {
when (this) {
PAST_DAYS -> {
val defaultValue: String? by map
val data = arrayListOf<RowRepresentableEditDescriptor>()
data.add(
RowRepresentableEditDescriptor(
defaultValue,
inputType = InputType.TYPE_CLASS_NUMBER
)
)
}
}
return super.editingDescriptors(map)
}
*/
}

@ -294,8 +294,7 @@ enum class FilterSection : RowRepresentable {
)
)
FIXED_DATE -> {
rows.add(CustomizableRowRepresentable(customViewType = RowViewType.TITLE_VALUE_CHECK, resId = FilterRow.FROM.resId, isSelectable = true, value = "20/03/2019"))
rows.add(CustomizableRowRepresentable(customViewType = RowViewType.TITLE_VALUE_CHECK, resId = FilterRow.TO.resId, isSelectable = true, value = "20/03/2019"))
rows.addAll(arrayListOf(FilterRow.FROM, FilterRow.TO))
}
DURATION -> rows.addAll(arrayListOf(FilterRow.PAST_DAYS))
YEAR -> {

Loading…
Cancel
Save