diff --git a/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt index b5c48af6..85ef68bf 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt @@ -7,6 +7,7 @@ import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.SessionGroup import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.model.realm.TimeFrame import org.junit.Assert import org.junit.Assert.assertEquals @@ -26,7 +27,7 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { // convenience extension fun Session.Companion.testInstance(netResult: Double, startDate: Date, endDate: Date?): Session { - val session: Session = Session.newInstance() + val session: Session = Session.newInstance(super.mockRealm, false) session.result?.netResult = netResult session.timeFrame?.setDate(startDate, endDate) return session @@ -67,8 +68,8 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { realm.beginTransaction() - s1.timeFrame?.setDate(sd1, ed1) // duration = 1h, hourly = -100, bb100 = -200bb / 25hands * 100 = -800 - s2.timeFrame?.setDate(sd2, ed2) // duration = 3h, hourly = 100, bb100 = 150 / 75 * 100 = +200 + s1.timeFrame?.setDate(sd1, ed1) // netDuration = 1h, hourly = -100, bb100 = -200bb / 25hands * 100 = -800 + s2.timeFrame?.setDate(sd2, ed2) // netDuration = 3h, hourly = 100, bb100 = 150 / 75 * 100 = +200 realm.copyToRealmOrUpdate(s1) realm.copyToRealmOrUpdate(s2) @@ -102,7 +103,7 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { if (duration != null) { assertEquals(4.0, duration.value, delta) } else { - Assert.fail("No duration stat") + Assert.fail("No netDuration stat") } val hourlyRate = results.computedStat(Stat.HOURLY_RATE) @@ -207,7 +208,6 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { realm.insert(s1) realm.insert(s2) - realm.commitTransaction() val sdf = SimpleDateFormat("dd/M/yyyy hh:mm") @@ -216,10 +216,9 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { val sd2 = sdf.parse("01/1/2019 08:00") val ed2 = sdf.parse("01/1/2019 11:00") - realm.beginTransaction() - s1.timeFrame?.setDate(sd1, ed1) // duration = 1h, hourly = -100, bb100 = -200bb / 25hands * 100 = -800 - s2.timeFrame?.setDate(sd2, ed2) // duration = 4h, hourly = 100, bb100 = 150 / 75 * 100 = +200 + s1.timeFrame?.setDate(sd1, ed1) // netDuration = 1h, hourly = -100, bb100 = -200bb / 25hands * 100 = -800 + s2.timeFrame?.setDate(sd2, ed2) // netDuration = 4h, hourly = 100, bb100 = 150 / 75 * 100 = +200 realm.copyToRealmOrUpdate(s1) realm.copyToRealmOrUpdate(s2) @@ -274,7 +273,6 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { realm.insert(s1) realm.insert(s2) realm.insert(s3) - realm.commitTransaction() val sdf = SimpleDateFormat("dd/M/yyyy hh:mm") @@ -285,11 +283,9 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { val sd3 = sdf.parse("01/1/2019 03:00") val ed3 = sdf.parse("01/1/2019 06:00") - realm.beginTransaction() - - s1.timeFrame?.setDate(sd1, ed1) // duration = 4h - s2.timeFrame?.setDate(sd2, ed2) // duration = 4h - s3.timeFrame?.setDate(sd3, ed3) // duration = 3h + s1.timeFrame?.setDate(sd1, ed1) // netDuration = 4h + s2.timeFrame?.setDate(sd2, ed2) // netDuration = 4h + s3.timeFrame?.setDate(sd3, ed3) // netDuration = 3h realm.copyToRealmOrUpdate(s1) realm.copyToRealmOrUpdate(s2) @@ -370,9 +366,9 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { realm.beginTransaction() - s1.timeFrame?.setDate(sd1, ed1) // duration = 4h - s2.timeFrame?.setDate(sd2, ed2) // duration = 4h - s3.timeFrame?.setDate(sd3, ed3) // duration = 3h + s1.timeFrame?.setDate(sd1, ed1) // netDuration = 4h + s2.timeFrame?.setDate(sd2, ed2) // netDuration = 4h + s3.timeFrame?.setDate(sd3, ed3) // netDuration = 3h realm.copyToRealmOrUpdate(s1) realm.copyToRealmOrUpdate(s2) @@ -393,12 +389,9 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { if (duration != null) { assertEquals(8.0, duration.value, delta) } else { - Assert.fail("No duration stat") + Assert.fail("No netDuration stat") } -// realm.beginTransaction() -// s1.deleteFromRealm() -// realm.commitTransaction() realm.executeTransaction { s1.deleteFromRealm() } @@ -414,4 +407,112 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { } } + + + @Test + fun testSessionSetCount() { + + val realm = this.mockRealm + + realm.beginTransaction() + val s1 = realm.createObject(Session::class.java, "1") + + s1.timeFrame = realm.createObject(TimeFrame::class.java) + + s1.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java) + + realm.insert(s1) + + val sdf = SimpleDateFormat("dd/M/yyyy hh:mm") + + val sd1 = sdf.parse("01/1/2019 09:00") + val ed1 = sdf.parse("01/1/2019 10:00") + + s1.timeFrame?.setDate(sd1, ed1) // netDuration = 1h, hourly = -100, bb100 = -200bb / 25hands * 100 = -800 + + realm.copyToRealmOrUpdate(s1) + realm.commitTransaction() + + val sets = realm.where(SessionSet::class.java).findAll() + + Assert.assertEquals(1, sets.size) + + val set = sets.first() + if (set != null) { + Assert.assertEquals(sd1.time, set.timeFrame?.startDate?.time) + Assert.assertEquals(ed1.time, set.timeFrame?.endDate?.time) + } else { + Assert.fail("No set") + } + + } + + @Test + fun testSessionSetCount2() { + + val realm = this.mockRealm + + realm.beginTransaction() + val s1 = realm.createObject(Session::class.java, "1") + val s2 = realm.createObject(Session::class.java, "2") + + s1.timeFrame = realm.createObject(TimeFrame::class.java) + s2.timeFrame = realm.createObject(TimeFrame::class.java) + + s1.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java) + s2.result = realm.createObject(net.pokeranalytics.android.model.realm.Result::class.java) + + realm.insert(s1) + realm.insert(s2) + + val sdf = SimpleDateFormat("dd/M/yyyy hh:mm") + + val sd1 = sdf.parse("01/1/2019 09:00") + val ed1 = sdf.parse("01/1/2019 10:00") + val sd2 = sdf.parse("01/2/2018 09:00") + val ed2 = sdf.parse("01/2/2018 10:00") + + s1.timeFrame?.let { + it.setStart(sd1) + it.setEnd(ed1) + } + + s2.timeFrame?.let { + it.setStart(sd2) + it.setEnd(ed2) + } + +// s1.timeFrame?.setDate(sd1, ed1) // netDuration = 1h, hourly = -100, bb100 = -200bb / 25hands * 100 = -800 +// s2.timeFrame?.setDate(sd2, ed2) // netDuration = 1h, hourly = -100, bb100 = -200bb / 25hands * 100 = -800 + + realm.copyToRealmOrUpdate(s1) + realm.copyToRealmOrUpdate(s2) + + realm.commitTransaction() + + val sets = realm.where(SessionSet::class.java).findAll() + + Assert.assertEquals(2, sets.size) + +// val set = sets.first() +// if (set != null) { +// Assert.assertEquals(sd1.time, set.timeFrame?.startDate?.time) +// Assert.assertEquals(ed1.time, set.timeFrame?.endDate?.time) +// } else { +// Assert.fail("No set") +// } + + } + +// @Test +// fun testDurationConversion() { +// +// val duration = 6.7555561274509826 +// val longDuration = duration.toLong() +// val formatted = longDuration.toMinutes() +// +// assert(formatted == "11:00") +// } + + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 0d7c697b..54d41a10 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -131,8 +131,8 @@ class PokerAnalyticsApplication : Application() { for (index in 0..50) { realm.executeTransaction { - val session = Session() - session.id = UUID.randomUUID().toString() + val session = Session.newInstance(realm, false) +// session.id = UUID.randomUUID().toString() val calendar = Calendar.getInstance() calendar.set( @@ -148,21 +148,27 @@ class PokerAnalyticsApplication : Application() { calendar.add(Calendar.MINUTE, (0..59).random()) val endDate = calendar.time - val timeFrame = TimeFrame() - timeFrame.setDate(startDate, endDate) - session.timeFrame = timeFrame +// val timeFrame = TimeFrame() + + session.timeFrame?.let { +// it.startDate = startDate +// it.endDate = endDate + it.setDate(startDate, endDate) + } + +// session.timeFrame = timeFrame session.creationDate = startDate session.limit = Limit.values().random().ordinal session.game = realm.where().findAll().random() - val result = Result() - result.buyin = arrayListOf(100, 200, 300, 500, 1000, 2000).random().toDouble() - result.netResult = arrayListOf( - -2500.0, -2000.0, -1500.0, -1000.0, -500.0, 200.0, 1000.0, 1500.0, - 2500.0 - ).random() - session.result = result + session.result?.let { result -> + result.buyin = arrayListOf(100, 200, 300, 500, 1000, 2000).random().toDouble() + result.netResult = arrayListOf( + -2500.0, -2000.0, -1500.0, -1000.0, -500.0, 200.0, 1000.0, 1500.0, + 2500.0 + ).random() + } realm.copyToRealmOrUpdate(session) } @@ -172,6 +178,16 @@ class PokerAnalyticsApplication : Application() { realm.close() + val sets = realm.where(SessionSet::class.java).findAll() + +// Timber.d("sets = ${sets.size}") +// +// sets.forEach { set -> +// Timber.d("set sd = : ${set.timeFrame?.startDate}, ed = ${set.timeFrame?.endDate}") +// } + + + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt index cf3414de..171d5285 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -7,7 +7,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.FormatUtils import net.pokeranalytics.android.util.formatted -import net.pokeranalytics.android.util.toMinutes +import net.pokeranalytics.android.util.formattedHourlyDuration /** * An enum representing all the types of Session statistics @@ -138,7 +138,7 @@ class ComputedStat(stat: Stat, value: Double) { return TextFormat("${value.toInt()}") } // white durations Stat.DURATION, Stat.AVERAGE_DURATION -> { - return TextFormat("${value.toLong().toMinutes()}") + return TextFormat(value.formattedHourlyDuration()) } // red/green percentages Stat.WIN_RATIO, Stat.ROI -> { val color = if (value >= this.stat.threshold) R.color.green else R.color.red diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index 3a3fea3c..6e82814d 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -11,69 +11,68 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import java.util.* import kotlin.collections.ArrayList -open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource, - RowRepresentable { +open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable { - @PrimaryKey - var id = UUID.randomUUID().toString() + @PrimaryKey + var id = UUID.randomUUID().toString() - // The name of the game - var name: String = "" + // The name of the game + var name: String = "" - // A shorter name for the game - var shortName: String? = null + // A shorter name for the game + var shortName: String? = null - override fun getDisplayName(): String { - return this.name - } + override fun getDisplayName(): String { + return this.name + } - override fun uniqueIdentifier(): String { - return this.id - } + override fun uniqueIdentifier(): String { + return this.id + } - override fun adapterRows(): List? { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(GameRow.values()) - return rows - } + override fun adapterRows(): List? { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(GameRow.values()) + return rows + } - override fun stringForRow(row: RowRepresentable): String { - return when (row) { - SimpleRow.NAME -> this.name - GameRow.SHORT_NAME -> this.shortName?:"" - else -> return super.stringForRow(row) - } - } + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> this.name + GameRow.SHORT_NAME -> this.shortName ?: "" + else -> return super.stringForRow(row) + } + } - override fun editDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() - when (row) { - SimpleRow.NAME -> data.add( - RowRepresentableEditDescriptor( - this.name, - SimpleRow.NAME.resId - ) - ) - GameRow.SHORT_NAME -> data.add( - RowRepresentableEditDescriptor( - this.shortName, - GameRow.SHORT_NAME.resId - ) - ) - } - return data - } + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() + when (row) { + SimpleRow.NAME -> data.add( + RowRepresentableEditDescriptor( + this.name, + SimpleRow.NAME.resId + ) + ) + GameRow.SHORT_NAME -> data.add( + RowRepresentableEditDescriptor( + this.shortName, + GameRow.SHORT_NAME.resId + ) + ) + } + return data + } - override fun updateValue(value: Any?, row: RowRepresentable) { - when (row) { - SimpleRow.NAME -> this.name = value as String? ?: "" - GameRow.SHORT_NAME -> this.shortName = value as String - } - } + override fun updateValue(value: Any?, row: RowRepresentable) { + when (row) { + SimpleRow.NAME -> this.name = value as String? ?: "" + GameRow.SHORT_NAME -> this.shortName = value as String + } + } - override fun isValidForSave(): Boolean { - return this.name.isNotEmpty() - } + override fun isValidForSave(): Boolean { + return this.name.isNotEmpty() + } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index fcba2991..6963dd57 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -37,6 +37,7 @@ open class Session : RealmObject(), SessionInterface, Savable, companion object { fun newInstance(realm: Realm, isTournament: Boolean): Session { val session = Session() + session.timeFrame = TimeFrame() session.result = Result() session.bankroll = realm.where().findFirst() session.type = if (isTournament) Session.Type.TOURNAMENT.ordinal else Session.Type.CASH_GAME.ordinal @@ -59,7 +60,7 @@ open class Session : RealmObject(), SessionInterface, Savable, var timeFrame: TimeFrame? = null set(value) { field = value - value?.let { it.notifySessionDateChange(this) } +// value?.let { it.notifySessionDateChange(this) } } // The time frame sessionGroup, which can contain multiple sessions @@ -142,7 +143,8 @@ open class Session : RealmObject(), SessionInterface, Savable, when (getState()) { SessionState.PENDING, SessionState.PLANNED -> { val sessionTimeFrame = this.timeFrame ?: realm.createObject(TimeFrame::class.java) - sessionTimeFrame.setDate(Date(), null) + sessionTimeFrame.setStart(Date()) +// sessionTimeFrame.setDate(Date(), null) this.timeFrame = sessionTimeFrame } SessionState.PAUSED -> { @@ -178,7 +180,8 @@ open class Session : RealmObject(), SessionInterface, Savable, SessionState.STARTED, SessionState.PAUSED -> { this.timeFrame?.paused = false this.timeFrame?.pauseDate = null - this.timeFrame?.setDate(null, Date()) + this.timeFrame?.setEnd(Date()) +// this.timeFrame?.setDate(null, Date()) } else -> throw Exception("Stopping session in unmanaged state") } @@ -198,7 +201,7 @@ open class Session : RealmObject(), SessionInterface, Savable, } /** - * Return the duration of the current session + * Return the netDuration of the current session */ fun getDuration(): String { val startDate = timeFrame?.startDate ?: Date() @@ -467,6 +470,7 @@ open class Session : RealmObject(), SessionInterface, Savable, result?.cashout?.round(), inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL + or InputType.TYPE_NUMBER_FLAG_SIGNED ) ) } @@ -569,7 +573,7 @@ open class Session : RealmObject(), SessionInterface, Savable, localResult.cashout = (value as String).toDouble() val timeFrameToUpdate = if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java) - timeFrameToUpdate.setDate(null, Date()) + timeFrameToUpdate.setEnd(Date()) timeFrame = timeFrameToUpdate } @@ -580,7 +584,8 @@ open class Session : RealmObject(), SessionInterface, Savable, SessionRow.END_DATE -> if (value is Date?) { val timeFrameToUpdate = if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java) - timeFrameToUpdate.setDate(null, value) +// timeFrameToUpdate.setDate(null, value) + timeFrameToUpdate.setEnd(value) timeFrame = timeFrameToUpdate } SessionRow.GAME -> { @@ -614,7 +619,8 @@ open class Session : RealmObject(), SessionInterface, Savable, } else { val timeFrameToUpdate = if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java) - timeFrameToUpdate.setDate(value, null) + timeFrameToUpdate.setStart(value) +// timeFrameToUpdate.setDate(value, null) timeFrame = timeFrameToUpdate } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt index 659787a8..88b02fb0 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt @@ -9,6 +9,16 @@ import io.realm.annotations.LinkingObjects open class SessionSet() : RealmObject() { + companion object { + + fun newInstance(realm: Realm) : SessionSet { + val sessionSet: SessionSet = realm.createObject(SessionSet::class.java) + sessionSet.timeFrame = realm.createObject(TimeFrame::class.java) + return realm.copyToRealm(sessionSet) + } + + } + /** * The timeframe of the set, i.e. its start & end date */ @@ -21,13 +31,13 @@ open class SessionSet() : RealmObject() { @LinkingObjects("sessionSet") val sessions: RealmResults? = null - @Ignore // a duration shortcut + @Ignore // a netDuration shortcut var duration: Long = 0L get() { - return this.timeFrame?.duration ?: 0L + return this.timeFrame?.netDuration ?: 0L } - @Ignore // a duration in hour + @Ignore // a netDuration in hour var hourlyDuration: Double = 0.0 get() { return this.timeFrame?.hourlyDuration ?: 0.0 @@ -39,7 +49,7 @@ open class SessionSet() : RealmObject() { return this.sessions?.sumByDouble { it.value } ?: 0.0 } - @Ignore // a duration shortcut + @Ignore // a netDuration shortcut var hourlyRate: Double = 0.0 get () { return this.netResult / this.hourlyDuration @@ -51,15 +61,6 @@ open class SessionSet() : RealmObject() { @Ignore var bbNetResult: Double = 0.0 - companion object { - - fun newInstance(realm: Realm) : SessionSet { - val sessionSet: SessionSet = realm.createObject(SessionSet::class.java) - sessionSet.timeFrame = realm.createObject(TimeFrame::class.java) - return sessionSet - } - - } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt index 8ac2f2fd..d8f548ea 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt @@ -1,6 +1,5 @@ package net.pokeranalytics.android.model.realm -import io.realm.Realm import io.realm.RealmObject import io.realm.RealmQuery import io.realm.RealmResults @@ -26,32 +25,32 @@ open class TimeFrame : RealmObject() { this.computeDuration() } - // The latest pause date - var pauseDate: Date? = null - set(value) { - field?.let { - if (value == null && field != null) { - breakDuration += Date().time - it.time - } - } - field = value - this.computeDuration() - } - - // The break duration + // The latest pause date + var pauseDate: Date? = null + set(value) { + field?.let { + if (value == null && field != null) { + breakDuration += Date().time - it.time + } + } + field = value + this.computeDuration() + } + + // The break netDuration var breakDuration: Long = 0L set(value) { field = value this.computeDuration() } - // the total duration - var duration: Long = 0L + // the total netDuration + var netDuration: Long = 0L private set var hourlyDuration: Double = 0.0 get() { - return this.duration / 3600000.0 // 3.6 millions of milliseconds + return this.netDuration / 3600000.0 // 3.6 millions of milliseconds } // indicates a state of pause @@ -73,29 +72,35 @@ open class TimeFrame : RealmObject() { var set: SessionSet? = null get() = this.sets?.first() - fun setDate(startDate: Date?, endDate: Date?) { - - startDate?.let { - this.startDate = startDate + fun setStart(startDate: Date) { + this.startDate = startDate + this.session?.let { + this.notifySessionDateChange(it) } + } + fun setEnd(endDate: Date?) { this.endDate = endDate + this.session?.let { + this.notifySessionDateChange(it) + } + } - this.computeDuration() + fun setDate(startDate: Date, endDate: Date?) { + this.startDate = startDate + this.endDate = endDate this.session?.let { this.notifySessionDateChange(it) } - } /** - * Computes the net duration of the session + * Computes the net netDuration of the session */ private fun computeDuration() { var endDate: Date = this.endDate ?: Date() - val netDuration = endDate.time - this.startDate.time - this.breakDuration - this.duration = netDuration + this.netDuration = endDate.time - this.startDate.time - this.breakDuration } /** @@ -103,25 +108,35 @@ open class TimeFrame : RealmObject() { * Makes all necessary changes to keep sequential time frames */ fun notifySessionDateChange(owner: Session) { - val realm = Realm.getDefaultInstance() - var query: RealmQuery = realm.where(SessionSet::class.java) + + var query: RealmQuery = this.realm.where(SessionSet::class.java) query.isNotNull("timeFrame") // Timber.d("this> sd = : ${this.startDate}, ed = ${this.endDate}") + val sets = realm.where(SessionSet::class.java).findAll() +// Timber.d("set count = ${sets.size}") + if (this.endDate == null) { - query.greaterThan("timeFrame.startDate", this.startDate).or().greaterThan("timeFrame.endDate", this.startDate) + query.greaterThanOrEqualTo("timeFrame.startDate", this.startDate) + .or() + .greaterThanOrEqualTo("timeFrame.endDate", this.startDate) + .or() + .isNull("timeFrame.endDate") } else { val endDate = this.endDate!! query - .lessThan("timeFrame.startDate", this.startDate) - .greaterThan("timeFrame.endDate", this.startDate) + .lessThanOrEqualTo("timeFrame.startDate", this.startDate) + .greaterThanOrEqualTo("timeFrame.endDate", this.startDate) + .or() + .lessThanOrEqualTo("timeFrame.startDate", endDate) + .greaterThanOrEqualTo("timeFrame.endDate", endDate) .or() - .lessThan("timeFrame.startDate", endDate) - .greaterThan("timeFrame.endDate", endDate) + .greaterThanOrEqualTo("timeFrame.startDate", this.startDate) + .lessThanOrEqualTo("timeFrame.endDate", endDate) .or() - .greaterThan("timeFrame.startDate", this.startDate) - .lessThan("timeFrame.endDate", endDate) + .isNull("timeFrame.endDate") + .lessThanOrEqualTo("timeFrame.startDate", endDate) } val sessionGroups = query.findAll() @@ -137,7 +152,7 @@ open class TimeFrame : RealmObject() { when (sessionSets.size) { 0 -> this.createSessionGroup(owner) - 1 -> this.updateSingleSessionGroup(owner, sessionSets.first()!!) + 1 -> this.updateSessionGroup(owner, sessionSets.first()!!) else -> this.mergeSessionGroups(owner, sessionSets) } @@ -148,9 +163,7 @@ open class TimeFrame : RealmObject() { */ private fun createSessionGroup(owner: Session) { - val realm = Realm.getDefaultInstance() - - val set: SessionSet = SessionSet.newInstance(realm) + val set: SessionSet = SessionSet.newInstance(this.realm) set.timeFrame?.let { it.startDate = this.startDate it.endDate = this.endDate @@ -160,29 +173,53 @@ open class TimeFrame : RealmObject() { owner.sessionSet = set - Timber.d("sd = : ${set.timeFrame?.startDate}, ed = ${set.timeFrame?.endDate}") +// Timber.d("sd = : ${set.timeFrame?.startDate}, ed = ${set.timeFrame?.endDate}") + Timber.d("netDuration 1 = : ${set.timeFrame?.netDuration}") } /** - * Single session sessionGroup update + * Single SessionSet update, the session might be the owner * Changes the sessionGroup timeframe using the current timeframe dates */ - private fun updateSingleSessionGroup(owner: Session, sessionSet: SessionSet) { + private fun updateSessionGroup(owner: Session, sessionSet: SessionSet) { - var groupTimeFrame: TimeFrame = sessionSet.timeFrame!! // tested in the query + var timeFrame: TimeFrame = sessionSet.timeFrame!! // tested in the query +// timeFrame.setDate(this.startDate, this.endDate) - if (this.startDate.before(groupTimeFrame.startDate)) { - groupTimeFrame.startDate = this.startDate - } - val endDate = this.endDate - if (endDate != null && groupTimeFrame.endDate != null && endDate.after(groupTimeFrame.endDate)) { - groupTimeFrame.endDate = endDate - } else if (endDate == null) { - groupTimeFrame.endDate = null - } + val sisterSessions = sessionSet.sessions!! // shouldn't crash ever + + // if we have only one session in the set and that it corresponds to the set + if (sessionSet.sessions?.size == 1 && sessionSet.sessions?.first() == owner) { + timeFrame.setDate(this.startDate, this.endDate) + } else { // there are 2+ sessions to manage and possible splits + + val endDate = this.endDate + + // case where all sessions are over but the set is not, we might have a split, so we delete the set and save everything again + if (endDate != null && sisterSessions.all { it.timeFrame?.endDate != null } && timeFrame.endDate == null) { + var sessions = mutableListOf(owner) + sessionSet.sessions?.forEach { sessions.add(it) } + sessionSet.deleteFromRealm() + sessions.forEach { it.timeFrame?.notifySessionDateChange(it) } + } else { - owner.sessionSet = sessionSet + if (this.startDate.before(timeFrame.startDate)) { + timeFrame.startDate = this.startDate + } + if (endDate != null && timeFrame.endDate != null && endDate.after(timeFrame.endDate)) { + timeFrame.endDate = endDate + } else if (endDate == null) { + timeFrame.endDate = null + } + + owner.sessionSet = sessionSet + +// Timber.d("sd = : ${sessionSet.timeFrame?.startDate}, ed = ${sessionSet.timeFrame?.endDate}") + Timber.d("netDuration 2 = : ${sessionSet.timeFrame?.netDuration}") + } + + } } @@ -216,25 +253,27 @@ open class TimeFrame : RealmObject() { // get all sessions from sets var sessions = mutableSetOf() - sessionSets.forEach { it.sessions?.asIterable()?.let { it1 -> sessions.addAll(it1) } } + sessionSets.forEach { set -> + set.sessions?.asIterable()?.let { sessions.addAll(it) } + } // delete all sets sessionSets.deleteAllFromRealm() // Create a new sets - val set: SessionSet = SessionSet.newInstance(realm) + val set: SessionSet = SessionSet.newInstance(this.realm) set.timeFrame?.let { - it.startDate = startDate - it.endDate = endDate + it.setDate(startDate, endDate) } ?: run { throw ModelException("TimeFrame should never be null here") } // Add the session linked to this timeframe to the new sessionGroup - owner.sessionSet = set + owner.sessionSet = set // Add all orphan sessions sessions.forEach { it.sessionSet = set } + Timber.d("netDuration 3 = : ${set.timeFrame?.netDuration}") } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt index c10cba32..c29e87b7 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt @@ -3,13 +3,15 @@ package net.pokeranalytics.android.model.realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable -import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource +import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import java.util.* +import kotlin.collections.ArrayList -open class TournamentType : RealmObject(), Savable, RowRepresentable { +open class TournamentType : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable { @PrimaryKey var id = UUID.randomUUID().toString() @@ -31,4 +33,36 @@ open class TournamentType : RealmObject(), Savable, RowRepresentable { } } + override fun adapterRows(): List? { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + //rows.addAll(TournamentType.values()) + return rows + } + + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> this.name + else -> return super.stringForRow(row) + } + } + + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() + when (row) { + SimpleRow.NAME -> data.add( + RowRepresentableEditDescriptor( + this.name, + SimpleRow.NAME.resId + ) + ) + } + return data + } + + override fun isValidForSave(): Boolean { + return this.name.isNotEmpty() + } + + } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt index 5b3e12f5..9665c990 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt @@ -73,7 +73,7 @@ class CurrenciesFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataS override fun adapterRows(): List? { val rows = ArrayList() rows.addAll(mostUsedCurrencies) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.currency)) + rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.currency)) rows.addAll(availableCurrencies) return rows diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index bed75b34..8642d0f1 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -14,15 +14,19 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Savable +import net.pokeranalytics.android.model.realm.Bankroll +import net.pokeranalytics.android.model.realm.Game +import net.pokeranalytics.android.model.realm.Location +import net.pokeranalytics.android.model.realm.TournamentType import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate -import net.pokeranalytics.android.ui.helpers.PlacePickerManager import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment +import net.pokeranalytics.android.ui.helpers.PlacePickerManager import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow @@ -137,10 +141,21 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, finishActivityWithResult(uniqueIdentifier) } } else { + + val message = when(item) { + is Bankroll -> R.string.empty_name_for_br_error + is Location -> R.string.location_empty_field_error + is Game -> R.string.location_empty_field_error + is TournamentType -> R.string.tt_empty_field_error + //is TransactionType -> R.string.operation_type_empty_field_error + else -> throw IllegalStateException("Need to manage ${item::class.java} error") + } + val builder = AlertDialog.Builder(requireContext()) - .setMessage(R.string.empty_name_for_br_error) + .setMessage(message) .setNegativeButton(R.string.ok, null) builder.show() + } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index aa692789..f13e6b38 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -127,7 +127,7 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource if (!calendar.isSameDay(currentCalendar) || index == 0) { calendar.time = currentCalendar.time val header = HeaderRowRepresentable( - customViewType = RowViewType.HEADER_SESSION, + customViewType = RowViewType.HEADER_TITLE, title = session.creationDate.longDate() ) rows.add(header) @@ -136,7 +136,7 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource if (!calendar.isSameMonth(currentCalendar) || index == 0) { calendar.time = currentCalendar.time val header = HeaderRowRepresentable( - customViewType = RowViewType.HEADER_SESSION, + customViewType = RowViewType.HEADER_TITLE, title = session.creationDate.getMonthAndYear() ) rows.add(header) @@ -165,8 +165,8 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource } override fun viewTypeForPosition(position: Int): Int { - return if (rows[position].viewType == RowViewType.HEADER_SESSION.ordinal) { - RowViewType.HEADER_SESSION.ordinal + return if (rows[position].viewType == RowViewType.HEADER_TITLE.ordinal) { + RowViewType.HEADER_TITLE.ordinal } else { RowViewType.ROW_SESSION.ordinal } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index a82357bd..113114b2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -73,6 +73,14 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta SettingRow.CURRENCY -> { CurrenciesActivity.newInstance(requireContext()) } + SettingRow.FOLLOW_US -> { + when(position) { + 0 -> parentActivity.openUrl(BLOG) + 1 -> parentActivity.openUrl(INSTAGRAM) + 2 -> parentActivity.openUrl(TWITTER) + 3 -> parentActivity.openUrl(FACEBOOK) + } + } SettingRow.PRIVACY_POLICY -> parentActivity.openUrl(URL_PRIVACY_POLICY) SettingRow.TERMS_OF_USE -> parentActivity.openUrl(URL_TERMS) SettingRow.GDPR -> Toast.makeText(requireContext(), "Show GDPR", Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt index 918a1bce..6e9d00bf 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt @@ -141,7 +141,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc val rows: ArrayList = ArrayList() results.forEach { results -> - rows.add(HeaderRowRepresentable(RowViewType.TITLE, title = results.group.name)) + rows.add(HeaderRowRepresentable(title = results.group.name)) results.group.stats?.forEach { stat -> rows.add(StatRepresentable(stat, results.computedStat(stat))) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 78bc4193..c95c2036 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -3,15 +3,16 @@ package net.pokeranalytics.android.ui.view import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatTextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_bottom_sheet_grid_title.view.* import kotlinx.android.synthetic.main.row_bottom_sheet_title.view.* +import kotlinx.android.synthetic.main.row_header_title.view.* import kotlinx.android.synthetic.main.row_header_title_amount.view.* import kotlinx.android.synthetic.main.row_header_title_value.view.* import kotlinx.android.synthetic.main.row_history_session.view.* -import kotlinx.android.synthetic.main.row_history_session_header.view.* import kotlinx.android.synthetic.main.row_stats_title_value.view.* import kotlinx.android.synthetic.main.row_title.view.* import kotlinx.android.synthetic.main.row_title_switch.view.* @@ -28,19 +29,16 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentabl * An interface used to factor the configuration of RecyclerView.ViewHolder */ interface BindableHolder { - fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { - } } enum class RowViewType { - HEADER, HEADER_TITLE_VALUE, HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT_BIG, - HEADER_SESSION, + HEADER_TITLE, EDIT_TEXT, TITLE, TITLE_ARROW, @@ -52,6 +50,7 @@ enum class RowViewType { TITLE_GRID, ROW_SESSION, BUTTON, + FOLLOW_US, STAT; /** @@ -136,10 +135,10 @@ enum class RowViewType { false ) ) - HEADER_SESSION -> { + HEADER_TITLE -> { HeaderSessionViewHolder( LayoutInflater.from(parent.context).inflate( - R.layout.row_history_session_header, + R.layout.row_header_title, parent, false ) @@ -161,6 +160,15 @@ enum class RowViewType { ) ) } + FOLLOW_US -> { + FollowUsViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_follow_us, + parent, + false + ) + ) + } STAT -> StatsTitleValueViewHolder( LayoutInflater.from(parent.context).inflate( R.layout.row_stats_title_value, @@ -176,12 +184,12 @@ enum class RowViewType { BindableHolder { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowHeaderTitleValue_title.text = row.localizedTitle(itemView.context) - adapter.dataSource?.let { + adapter.dataSource.let { itemView.rowHeaderTitleValue_value.text = it.stringForRow(row, itemView.context) } -// val listener = View.OnClickListener { -// adapter.delegate?.onRowSelected(position, row) -// } + //val listener = View.OnClickListener { + // adapter.delegate?.onRowSelected(position, row) + //} //itemView.rowHeaderTitleValue_container.setOnClickListener(listener) itemView.rowHeaderTitleValue_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE } @@ -236,6 +244,23 @@ enum class RowViewType { } } + inner class FollowUsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + itemView.findViewById(R.id.icon1).setOnClickListener { + adapter.delegate?.onRowSelected(0, row) + } + itemView.findViewById(R.id.icon2).setOnClickListener { + adapter.delegate?.onRowSelected(1, row) + } + itemView.findViewById(R.id.icon3).setOnClickListener { + adapter.delegate?.onRowSelected(2, row) + } + itemView.findViewById(R.id.icon4).setOnClickListener { + adapter.delegate?.onRowSelected(3, row) + } + } + } + inner class StatsTitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt index bec9dfe3..62f34061 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt @@ -8,7 +8,7 @@ import net.pokeranalytics.android.ui.view.RowViewType * A class to display headers as row representable */ class HeaderRowRepresentable( - var customViewType: RowViewType? = RowViewType.HEADER, + var customViewType: RowViewType? = RowViewType.HEADER_TITLE, override var resId: Int? = null, var title: String? = null, var value: String? = null @@ -26,6 +26,6 @@ class HeaderRowRepresentable( } - override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER.ordinal + override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER_TITLE.ordinal } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt index 7d4f27d6..df23556a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt @@ -25,7 +25,6 @@ enum class SettingRow : RowRepresentable { GAME, LOCATION, TOURNAMENT_TYPE, - TRANSACTION_TYPE, // Terms PRIVACY_POLICY, @@ -40,24 +39,24 @@ enum class SettingRow : RowRepresentable { fun getRows(): ArrayList { val rows = ArrayList() - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.information)) + rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.information)) rows.addAll(arrayListOf(VERSION, RATE_APP, CONTACT_US, BUG_REPORT)) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.follow_us)) + rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.follow_us)) rows.addAll(arrayListOf(FOLLOW_US)) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.preferences)) + rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.preferences)) rows.addAll(arrayListOf(CURRENCY)) rows.add( HeaderRowRepresentable( - customViewType = RowViewType.HEADER_SESSION, + customViewType = RowViewType.HEADER_TITLE, resId = R.string.data_management ) ) - rows.addAll(arrayListOf(BANKROLL, GAME, LOCATION, TOURNAMENT_TYPE, TRANSACTION_TYPE)) + rows.addAll(arrayListOf(BANKROLL, GAME, LOCATION, TOURNAMENT_TYPE)) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.terms)) + rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.terms)) rows.addAll(arrayListOf(PRIVACY_POLICY, TERMS_OF_USE, GDPR)) return rows @@ -90,6 +89,7 @@ enum class SettingRow : RowRepresentable { get() { return when (this) { VERSION -> RowViewType.TITLE_VALUE.ordinal + FOLLOW_US -> RowViewType.FOLLOW_US.ordinal else -> RowViewType.TITLE_ARROW.ordinal } } @@ -101,7 +101,6 @@ enum class SettingRow : RowRepresentable { GAME -> LiveData.GAME LOCATION -> LiveData.LOCATION TOURNAMENT_TYPE -> LiveData.TOURNAMENT_TYPE - TRANSACTION_TYPE -> LiveData.TRANSACTION_TYPE else -> null } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/DateExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/DateExtension.kt index af945f5e..6029e96b 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/DateExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/DateExtension.kt @@ -84,7 +84,7 @@ fun Date.getMonthAndYear(): String { return SimpleDateFormat("MMMM YYYY", Locale.getDefault()).format(this).capitalize() } -// Return the duration between two dates +// Return the netDuration between two dates fun Date.getDuration(toDate: Date) : String { val difference = (toDate.time - this.time).toInt() val numOfDays = (difference / (1000 * 60 * 60 * 24)) diff --git a/app/src/main/java/net/pokeranalytics/android/util/Global.kt b/app/src/main/java/net/pokeranalytics/android/util/Global.kt index 4d98f7ce..e121a598 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Global.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Global.kt @@ -1,8 +1,17 @@ package net.pokeranalytics.android.util +val NULL_TEXT: String = "--" +// Support const val SUPPORT_EMAIL = "support@pokeranalytics.net" + +// Terms const val URL_PRIVACY_POLICY = "https://www.poker-analytics.net/privacypolicy.html" const val URL_TERMS = "https://www.poker-analytics.net/terms.html" -val NULL_TEXT: String = "--" +// Social Network +const val BLOG = "https://medium.com/poker-analytics" +const val INSTAGRAM = "https://www.instagram.com/pokeranalytics" +const val TWITTER = "https://twitter.com/paapptweet" +const val FACEBOOK = "https://www.facebook.com/171053452998758" + diff --git a/app/src/main/java/net/pokeranalytics/android/util/NumbersExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/NumbersExtension.kt index 40ca65f8..d4d4bfda 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/NumbersExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/NumbersExtension.kt @@ -25,6 +25,10 @@ fun Double.toCurrency(): String { return format.format(this) } +fun Double.formattedHourlyDuration() : String { + return (this * 1000 * 3600).toLong().toMinutes() +} + // Return the time from milliseconds to hours:minutes fun Long.toMinutes() : String { val totalMinutes = this / (1000 * 60) diff --git a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt index f6eb8f1c..f62d4674 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -6,7 +6,7 @@ import java.util.* class Preferences { - enum class Keys(identifier: String) { + enum class Keys(var identifier: String) { CURRENCY_LANGUAGE("CurrencyLanguage") } @@ -15,13 +15,13 @@ class Preferences { fun setString(key: Keys, value: String, context: Context) { var preferences = PreferenceManager.getDefaultSharedPreferences(context) var editor = preferences.edit() - editor.putString(key.toString(), value) + editor.putString(key.identifier, value) editor.commit() } fun getString(key: Keys, context: Context) : String? { var preferences = PreferenceManager.getDefaultSharedPreferences(context) - return preferences.getString(key.name, null) + return preferences.getString(key.identifier, null) } fun setCurrencyLanguage(language: String, context: Context) { diff --git a/app/src/main/res/drawable-xxhdpi/add_tournament.png b/app/src/main/res/drawable-xxhdpi/add_tournament.png new file mode 100644 index 00000000..d2532d17 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/add_tournament.png differ diff --git a/app/src/main/res/drawable-xxhdpi/add_tournoi.png b/app/src/main/res/drawable-xxhdpi/add_tournoi.png deleted file mode 100644 index f78065a3..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/add_tournoi.png and /dev/null differ diff --git a/app/src/main/res/layout/fragment_history.xml b/app/src/main/res/layout/fragment_history.xml index c5b1fb98..e4ab0748 100644 --- a/app/src/main/res/layout/fragment_history.xml +++ b/app/src/main/res/layout/fragment_history.xml @@ -82,7 +82,7 @@ android:layout_marginEnd="8dp" android:text="@string/new_cash_game" app:icon="@drawable/add_cash_game" - app:iconSize="32dp" + app:iconSize="28dp" app:layout_constraintEnd_toStartOf="@+id/newTournament" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_chainStyle="spread" @@ -99,8 +99,8 @@ android:layout_marginTop="8dp" android:layout_marginEnd="16dp" android:text="@string/new_tournament" - app:icon="@drawable/add_tournoi" - app:iconSize="32dp" + app:icon="@drawable/add_tournament" + app:iconSize="28dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/newCashGame" diff --git a/app/src/main/res/layout/row_follow_us.xml b/app/src/main/res/layout/row_follow_us.xml new file mode 100644 index 00000000..b8ad4830 --- /dev/null +++ b/app/src/main/res/layout/row_follow_us.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_history_session_header.xml b/app/src/main/res/layout/row_header_title.xml similarity index 100% rename from app/src/main/res/layout/row_history_session_header.xml rename to app/src/main/res/layout/row_header_title.xml diff --git a/app/src/main/res/layout/row_session_view.xml b/app/src/main/res/layout/row_session_view.xml index fcc7ed1e..67b08d7b 100644 --- a/app/src/main/res/layout/row_session_view.xml +++ b/app/src/main/res/layout/row_session_view.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="56dp" android:background="?selectableItemBackground"> - #FFFFFF #30FFFFFF - #6AFFFFFF + #8AFFFFFF #141414 #1B1F1B diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6433b80d..3c1d7ae5 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -111,7 +111,7 @@ @@ -200,8 +200,9 @@