merge conflict resolution

dev_raz_wip
Razmig Sarkissian 7 years ago
commit 578ec83ca5
  1. 19
      app/build.gradle
  2. 24
      app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedTest.kt
  3. 106
      app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt
  4. 26
      app/src/androidTest/java/net/pokeranalytics/android/RealmInstrumentedUnitTest.kt
  5. 12
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  6. 8
      app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt
  7. 11
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  8. 18
      app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt
  9. 56
      app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt
  10. 4
      app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt
  11. 4
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DataListAdapter.kt
  12. 10
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicRowInterface.kt
  13. 5
      app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt
  14. 25
      app/src/main/java/net/pokeranalytics/android/ui/fragment/NewSessionFragment.kt
  15. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetData.kt
  16. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDateFragment.kt
  17. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDoubleEditTextFragment.kt
  18. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDoubleListFragment.kt
  19. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetEditTextFragment.kt
  20. 20
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetFragment.kt
  21. 30
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetListFragment.kt
  22. 10
      app/src/main/res/layout/bottom_sheet_list.xml
  23. 19
      app/src/main/res/layout/fragment_bottom_sheet.xml
  24. 2
      app/src/main/res/layout/row_bottom_sheet_title.xml
  25. 19
      app/src/main/res/layout/row_title.xml
  26. 1
      app/src/main/res/values/colors.xml
  27. 60
      app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt
  28. 19
      app/src/test/java/net/pokeranalytics/android/RealmUnitTest.kt

@ -61,11 +61,24 @@ dependencies {
implementation 'com.jakewharton.timber:timber:4.7.1' implementation 'com.jakewharton.timber:timber:4.7.1'
// Test // Test
testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:core:1.0.0'
androidTestImplementation 'androidx.test:core:1.1.0'
androidTestImplementation 'androidx.test:runner:1.1.0' androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test:rules:1.1.0' androidTestImplementation 'androidx.test:rules:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' androidTestImplementation 'androidx.test.ext:junit:1.1.0'
// Required -- JUnit 4 framework
testImplementation 'junit:junit:4.12'
// Optional -- Robolectric environment
// testImplementation 'androidx.test:core:1.1.0'
// Optional -- Mockito framework
testImplementation 'com.android.support.test:runner:1.0.1'
testImplementation 'com.android.support.test:rules:1.0.1'
// testImplementation 'androidx.test.espresso:espresso-core:3.1.0'
} }
apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.gms.google-services'

@ -1,24 +0,0 @@
package net.pokeranalytics.android
import androidx.test.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getTargetContext()
assertEquals("net.pokeranalytics.android", appContext.packageName)
}
}

@ -0,0 +1,106 @@
package net.pokeranalytics.android
import androidx.test.ext.junit.runners.AndroidJUnit4
import net.pokeranalytics.android.calculus.Calculator
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.TimeFrame
import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import java.text.SimpleDateFormat
import java.util.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() {
// convenience extension
fun Session.Companion.testInstance(netResult: Double, startDate: Date, endDate: Date?): Session {
var session: Session = Session.newInstance()
session.result?.netResult = netResult
session.timeFrame?.setDate(startDate, endDate)
return session
}
@Test
fun testSessionStats() {
val realm = this.mockRealm
realm.beginTransaction()
val sdf = SimpleDateFormat("dd/M/yyyy hh:mm")
val sd1 = sdf.parse("01/1/2019 10:00")
val ed1 = sdf.parse("01/1/2019 11:00")
val sd2 = sdf.parse("02/1/2019 08:00")
val ed2 = sdf.parse("02/1/2019 11:00")
var s1 = realm.createObject(Session::class.java, "1")
var 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)
// var s1: Session = Session.newInstance()
// var s2: Session = Session.newInstance()
s1.result?.netResult = -100.0
s2.result?.netResult = 300.0
realm.insert(s1)
realm.insert(s2)
realm.commitTransaction()
realm.beginTransaction()
s1.timeFrame?.setDate(sd1, ed1)
s2.timeFrame?.setDate(sd2, ed2)
realm.copyToRealmOrUpdate(s1)
realm.copyToRealmOrUpdate(s2)
realm.commitTransaction()
val sessions = realm.where(Session::class.java).findAll()
val group = SessionGroup(name = "test", sessions = sessions)
val results: ComputedResults = Calculator.compute(group, Calculator.Options())
val delta = 0.01
val sum = results.computedStat(Stat.NETRESULT)
if (sum != null) {
assertEquals(200.0, sum.value, delta)
} else {
Assert.fail("No Net result stat")
}
val average = results.computedStat(Stat.AVERAGE)
if (average != null) {
assertEquals(100.0, average.value, delta)
} else {
Assert.fail("No AVERAGE stat")
}
val duration = results.computedStat(Stat.DURATION)
if (duration != null) {
assertEquals(4.0, duration.value, delta)
} else {
Assert.fail("No duration stat")
}
}
}

@ -0,0 +1,26 @@
package net.pokeranalytics.android
import io.realm.Realm
import io.realm.RealmConfiguration
import org.junit.After
import org.junit.Before
open class RealmInstrumentedUnitTest {
lateinit var mockRealm: Realm
@Before
fun setup() {
val testConfig = RealmConfiguration.Builder().inMemory().name("test-realm").build()
Realm.setDefaultConfiguration(testConfig)
mockRealm = Realm.getDefaultInstance()
}
@After
@Throws(Exception::class)
public fun tearDown() {
mockRealm.close()
}
}

@ -117,12 +117,12 @@ class Calculator {
var hourlyRate: Double = 0.0; var hourlyRateBB: Double = 0.0 var hourlyRate: Double = 0.0; var hourlyRateBB: Double = 0.0
var gIndex = 0; var gSum = 0.0; var gTotalHands = 0.0; var gBBSum = 0.0; var gIndex = 0; var gSum = 0.0; var gTotalHands = 0.0; var gBBSum = 0.0;
sessionSets.forEach { group -> sessionSets.forEach { sessionSet ->
gIndex++ gIndex++
duration += group.duration duration += sessionSet.hourlyDuration
gSum += group.netResult gSum += sessionSet.netResult
gTotalHands += group.estimatedHands gTotalHands += sessionSet.estimatedHands
gBBSum += group.bbNetResult gBBSum += sessionSet.bbNetResult
hourlyRate = gSum / duration * 3600.0 hourlyRate = gSum / duration * 3600.0
hourlyRateBB = gBBSum / duration * 3600.0 hourlyRateBB = gBBSum / duration * 3600.0
@ -133,7 +133,7 @@ class Calculator {
results.addEvolutionValue(Stat.netBBPer100Hands(gBBSum, gTotalHands), duration, NET_BB_PER_100_HANDS) results.addEvolutionValue(Stat.netBBPer100Hands(gBBSum, gTotalHands), duration, NET_BB_PER_100_HANDS)
results.addEvolutionValue(hourlyRate, duration, HOURLY_RATE) results.addEvolutionValue(hourlyRate, duration, HOURLY_RATE)
results.addEvolutionValue(gIndex.toDouble(), duration, NUMBER_OF_GROUPS) results.addEvolutionValue(gIndex.toDouble(), duration, NUMBER_OF_GROUPS)
results.addEvolutionValue(group.duration, duration, DURATION) results.addEvolutionValue(sessionSet.duration.toDouble(), duration, DURATION)
results.addEvolutionValue(duration / gIndex, duration, AVERAGE_DURATION) results.addEvolutionValue(duration / gIndex, duration, AVERAGE_DURATION)
results.addEvolutionValue(hourlyRateBB, duration, HOURLY_RATE_BB) results.addEvolutionValue(hourlyRateBB, duration, HOURLY_RATE_BB)
} }

@ -2,15 +2,11 @@ package net.pokeranalytics.android.model.realm
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.RealmClass
import java.util.*
@RealmClass
open class Result : RealmObject() { open class Result : RealmObject() {
@PrimaryKey
var id = UUID.randomUUID().toString()
// the user associated to this session result // the user associated to this session result
var player: Player? = null var player: Player? = null

@ -11,7 +11,6 @@ import net.pokeranalytics.android.util.data.sessionDao
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, DisplayableDataSource, EditableDataSource { open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, DisplayableDataSource, EditableDataSource {
@PrimaryKey @PrimaryKey
@ -148,14 +147,20 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
override var title: String = "Change that: $creationDate" override var title: String = "Change that: $creationDate"
override val primaryKey: String get() = this.id override val primaryKey: String get() = this.id
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: DynamicRowInterface, realm: Realm): ArrayList<BottomSheetData> {
val data = ArrayList<BottomSheetData>() val data = ArrayList<BottomSheetData>()
// Todo: Localize & set real data // Todo: Localize & set real data
when (row) { when (row) {
SessionRow.GAME -> { SessionRow.GAME -> {
data.add(BottomSheetData(game, "", 0, arrayListOf(Game(), Game(), Game()))) data.add(BottomSheetData(game, "", 0, SettingRow.GAME.items(realm)))
}
SessionRow.LOCATION -> {
data.add(BottomSheetData(location, "", 0, SettingRow.LOCATION.items(realm)))
}
SessionRow.BANKROLL -> {
data.add(BottomSheetData(bankroll, "", 0, SettingRow.BANKROLL.items(realm)))
} }
SessionRow.DATE -> { SessionRow.DATE -> {
data.add(BottomSheetData(timeFrame?.startDate, "Start date")) data.add(BottomSheetData(timeFrame?.startDate, "Start date"))

@ -1,5 +1,6 @@
package net.pokeranalytics.android.model.realm package net.pokeranalytics.android.model.realm
import io.realm.Realm
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
@ -14,7 +15,16 @@ open class SessionSet() : RealmObject() {
var sessions: RealmList<Session> = RealmList() var sessions: RealmList<Session> = RealmList()
@Ignore // a duration shortcut @Ignore // a duration shortcut
var duration: Double = 0.0 var duration: Long = 0L
get() {
return this.timeFrame?.duration ?: 0L
}
@Ignore // a duration in hour
var hourlyDuration: Double = 0.0
get() {
return this.timeFrame?.hourlyDuration ?: 0.0
}
@Ignore // a netResult shortcut @Ignore // a netResult shortcut
var netResult: Double = 0.0 var netResult: Double = 0.0
@ -30,9 +40,9 @@ open class SessionSet() : RealmObject() {
companion object { companion object {
fun newInstance() : SessionSet { fun newInstance(realm: Realm) : SessionSet {
val sessionSet: SessionSet = SessionSet() val sessionSet: SessionSet = realm.createObject(SessionSet::class.java)
sessionSet.timeFrame = TimeFrame() sessionSet.timeFrame = realm.createObject(TimeFrame::class.java)
return sessionSet return sessionSet
} }

@ -9,16 +9,21 @@ import io.realm.annotations.LinkingObjects
import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.exceptions.ModelException
import java.util.* import java.util.*
open class TimeFrame : RealmObject() { open class TimeFrame : RealmObject() {
// A start date // A start date
var startDate: Date = Date() var startDate: Date = Date()
private set private set(value) {
field = value
this.computeDuration()
}
// An end date // An end date
var endDate: Date? = null var endDate: Date? = null
private set private set(value) {
field = value
this.computeDuration()
}
// The break duration // The break duration
var breakDuration: Long = 0L var breakDuration: Long = 0L
@ -31,6 +36,11 @@ open class TimeFrame : RealmObject() {
var duration: Long = 0L var duration: Long = 0L
private set private set
var hourlyDuration: Double = 0.0
get() {
return this.duration / 3600000.0 // 3.6 millions of milliseconds
}
// indicates a state of pause // indicates a state of pause
var paused: Boolean = false var paused: Boolean = false
@ -63,7 +73,8 @@ open class TimeFrame : RealmObject() {
private fun computeDuration() { private fun computeDuration() {
var endDate: Date = this.endDate ?: Date() var endDate: Date = this.endDate ?: Date()
this.duration = endDate.time - startDate.time - this.breakDuration val netDuration = endDate.time - this.startDate.time - this.breakDuration
this.duration = netDuration
} }
private fun notifySessionDateChange() { private fun notifySessionDateChange() {
@ -76,13 +87,13 @@ open class TimeFrame : RealmObject() {
} else { } else {
val endDate = this.endDate!! val endDate = this.endDate!!
query query
.greaterThan("timeFrame.startDate", this.startDate.time) .greaterThan("timeFrame.startDate", this.startDate)
.lessThan("timeFrame.endDate", this.startDate.time) .lessThan("timeFrame.endDate", this.startDate)
.or() .or()
.greaterThan("timeFrame.startDate", endDate) .greaterThan("timeFrame.startDate", endDate)
.lessThan("timeFrame.endDate", endDate) .lessThan("timeFrame.endDate", endDate)
.or() .or()
.lessThan("timeFrame.startDate", this.startDate.time) .lessThan("timeFrame.startDate", this.startDate)
.greaterThan("timeFrame.endDate", endDate) .greaterThan("timeFrame.endDate", endDate)
} }
@ -90,7 +101,7 @@ open class TimeFrame : RealmObject() {
this.updateTimeFrames(sessionGroups) this.updateTimeFrames(sessionGroups)
realm.close() // realm.close()
} }
/** /**
@ -112,17 +123,24 @@ open class TimeFrame : RealmObject() {
private fun createSessionGroup() { private fun createSessionGroup() {
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
realm.beginTransaction() // realm.beginTransaction()
val set: SessionSet = SessionSet.newInstance() val set: SessionSet = SessionSet.newInstance(realm)
set.timeFrame?.let { set.timeFrame?.let {
it.startDate = this.startDate it.startDate = this.startDate
it.endDate = this.endDate it.endDate = this.endDate
} ?: run { } ?: run {
throw ModelException("TimeFrame should never be null here") throw ModelException("TimeFrame should never be null here")
} }
set.sessions.add(this.session)
realm.commitTransaction() this.session?.let {
it.sessionSet = set
} ?: run {
throw ModelException("Session should never be null here")
}
// this.session?.sessionSet = set
// set.sessions.add(this.session)
// realm.commitTransaction()
} }
/** /**
@ -144,13 +162,13 @@ open class TimeFrame : RealmObject() {
} }
// Realm Update // Realm Update
val realm = Realm.getDefaultInstance() // val realm = Realm.getDefaultInstance()
realm.beginTransaction() realm.beginTransaction()
if (!sessionSet.sessions.contains(this.session)) { if (!sessionSet.sessions.contains(this.session)) {
sessionSet.sessions.add(this.session) sessionSet.sessions.add(this.session)
} }
realm.copyToRealmOrUpdate(groupTimeFrame) // realm.copyToRealmOrUpdate(groupTimeFrame)
realm.commitTransaction() // realm.commitTransaction()
} }
@ -185,14 +203,14 @@ open class TimeFrame : RealmObject() {
var sessions = sessionSets.flatMap { it.sessions } var sessions = sessionSets.flatMap { it.sessions }
// Start Realm updates // Start Realm updates
val realm = Realm.getDefaultInstance() // val realm = Realm.getDefaultInstance()
realm.beginTransaction() // realm.beginTransaction()
// delete all sets // delete all sets
sessionSets.deleteAllFromRealm() sessionSets.deleteAllFromRealm()
// Create a new sets // Create a new sets
val set: SessionSet = SessionSet.newInstance() val set: SessionSet = SessionSet.newInstance(realm)
set.timeFrame?.let { set.timeFrame?.let {
it.startDate = startDate it.startDate = startDate
it.endDate = endDate it.endDate = endDate
@ -210,7 +228,7 @@ open class TimeFrame : RealmObject() {
// Add all orphan sessions // Add all orphan sessions
set.sessions.addAll(sessions) set.sessions.addAll(sessions)
realm.commitTransaction() // realm.commitTransaction()
} }
} }

@ -5,13 +5,13 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import kotlinx.android.synthetic.main.activity_editable_data.* import kotlinx.android.synthetic.main.activity_editable_data.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.EditableDataFragment
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.EditableDataFragment
class EditableDataActivity : PokerAnalyticsActivity() { class EditableDataActivity : PokerAnalyticsActivity() {
companion object { companion object {
fun newInstance(context: Context, dataType: Int, primaryKey:String?) { fun newInstance(context: Context, dataType: Int, primaryKey: String? = null) {
val intent = Intent(context, EditableDataActivity::class.java) val intent = Intent(context, EditableDataActivity::class.java)
intent.putExtra("dataType", dataType) intent.putExtra("dataType", dataType)
primaryKey?.let { primaryKey?.let {

@ -6,7 +6,7 @@ import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.fragment_data_list.view.* import io.realm.Realm
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.components.BottomSheetData import net.pokeranalytics.android.ui.fragment.components.BottomSheetData
@ -22,7 +22,7 @@ interface DisplayableDataSource {
} }
interface EditableDataSource { interface EditableDataSource {
fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> fun getBottomSheetData(row: DynamicRowInterface, realm: Realm): ArrayList<BottomSheetData>
} }
class DataListAdapter(var delegate: DisplayableDelegate, var layout: Int? = null) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { class DataListAdapter(var delegate: DisplayableDelegate, var layout: Int? = null) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

@ -38,8 +38,10 @@ class SectionRow(stringRes: Int) : DynamicRowInterface {
} }
enum class SessionRow(val resId: Int) : DynamicRowInterface { enum class SessionRow(val resId: Int) : DynamicRowInterface {
BLINDS(R.string.blinds),
GAME(R.string.game), GAME(R.string.game),
BLINDS(R.string.blinds),
LOCATION(R.string.location),
BANKROLL(R.string.bankroll),
DATE(R.string.date); DATE(R.string.date);
override fun localizedTitle(context: Context): String { override fun localizedTitle(context: Context): String {
@ -49,7 +51,7 @@ enum class SessionRow(val resId: Int) : DynamicRowInterface {
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
BLINDS, GAME, DATE -> RowViewType.TITLE_VALUE.ordinal BLINDS, GAME, DATE, BANKROLL, LOCATION -> RowViewType.TITLE_VALUE.ordinal
} }
} }
@ -57,7 +59,9 @@ enum class SessionRow(val resId: Int) : DynamicRowInterface {
get() { get() {
return when (this) { return when (this) {
BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT
GAME -> BottomSheetType.DOUBLE_LIST GAME -> BottomSheetType.LIST
LOCATION -> BottomSheetType.LIST
BANKROLL -> BottomSheetType.LIST
DATE -> BottomSheetType.DATE DATE -> BottomSheetType.DATE
} }
} }

@ -8,7 +8,6 @@ import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.Realm import io.realm.Realm
import io.realm.RealmObject import io.realm.RealmObject
import kotlinx.android.synthetic.main.bottom_sheet_bankroll.*
import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_editable_data.*
import kotlinx.android.synthetic.main.fragment_editable_data.view.* import kotlinx.android.synthetic.main.fragment_editable_data.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
@ -41,6 +40,10 @@ class EditableDataFragment : PokerAnalyticsFragment(), DynamicRowCallback, Botto
BottomSheetFragment.create(fragmentManager, row, this, ArrayList()) BottomSheetFragment.create(fragmentManager, row, this, ArrayList())
} }
override fun clickOnAdd(row: DynamicRowInterface) {
Toast.makeText(requireContext(), "Add new element: $row", Toast.LENGTH_SHORT).show()
}
override fun setValue(value: Any, row: DynamicRowInterface) { override fun setValue(value: Any, row: DynamicRowInterface) {
Toast.makeText(requireContext(), "Callback for ${row.localizedTitle(requireContext())} ($value)", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "Callback for ${row.localizedTitle(requireContext())} ($value)", Toast.LENGTH_SHORT).show()
} }

@ -9,10 +9,9 @@ import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_new_session.* import kotlinx.android.synthetic.main.fragment_new_session.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.components.DynamicListAdapter import net.pokeranalytics.android.ui.adapter.components.*
import net.pokeranalytics.android.ui.adapter.components.DynamicRowCallback
import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface
import net.pokeranalytics.android.ui.fragment.components.BottomSheetDelegate import net.pokeranalytics.android.ui.fragment.components.BottomSheetDelegate
import net.pokeranalytics.android.ui.fragment.components.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.BottomSheetFragment
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
@ -32,17 +31,19 @@ class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, BottomS
} }
override fun onRowSelected(row: DynamicRowInterface) { override fun onRowSelected(row: DynamicRowInterface) {
/* val data = newSession.getBottomSheetData(row, getRealm())
val data = when (row.bottomSheetType) { BottomSheetFragment.create(fragmentManager, row, this, data)
BottomSheetType.BLINDS -> newSession }
BottomSheetType.DATE -> newSession.timeFrame
BottomSheetType.GAME -> newSession.game override fun clickOnAdd(row: DynamicRowInterface) {
else -> Any() Toast.makeText(requireContext(), "Add new element: $row", Toast.LENGTH_SHORT).show()
when(row) {
SessionRow.GAME -> EditableDataActivity.newInstance(requireContext(), SettingRow.GAME.ordinal)
SessionRow.BANKROLL -> EditableDataActivity.newInstance(requireContext(), SettingRow.BANKROLL.ordinal)
SessionRow.LOCATION -> EditableDataActivity.newInstance(requireContext(), SettingRow.LOCATION.ordinal)
} }
*/
val data = newSession.getBottomSheetData(row)
BottomSheetFragment.create(fragmentManager, row, this, data)
} }
override fun setValue(value: Any, row: DynamicRowInterface) { override fun setValue(value: Any, row: DynamicRowInterface) {

@ -1,11 +1,11 @@
package net.pokeranalytics.android.ui.fragment.components package net.pokeranalytics.android.ui.fragment.components
import android.text.InputType import android.text.InputType
import net.pokeranalytics.android.ui.adapter.components.DisplayableDataSource import io.realm.RealmResults
class BottomSheetData( class BottomSheetData(
var defaultValue: Any? = null, var defaultValue: Any? = null,
var hint: String? = "", var hint: String? = "",
var inputType: Int? = InputType.TYPE_CLASS_TEXT, var inputType: Int? = InputType.TYPE_CLASS_TEXT,
var data: ArrayList<DisplayableDataSource>? = ArrayList() var data: RealmResults<*>? = null
) )

@ -18,7 +18,7 @@ class BottomSheetDateFragment : BottomSheetFragment() {
override fun clickOnCheck() { override fun clickOnCheck() {
super.clickOnCheck() super.clickOnCheck()
//TODO: Change that //TODO: Change that
valueDelegate.setValue("", row) bottomSheetDelegate.setValue("", row)
dismiss() dismiss()
} }

@ -19,7 +19,7 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() {
override fun clickOnCheck() { override fun clickOnCheck() {
super.clickOnCheck() super.clickOnCheck()
valueDelegate.setValue("", row) bottomSheetDelegate.setValue("", row)
dismiss() dismiss()
} }

@ -25,7 +25,7 @@ class BottomSheetDoubleListFragment : BottomSheetFragment(), DisplayableDelegate
override fun clickOnCheck() { override fun clickOnCheck() {
super.clickOnCheck() super.clickOnCheck()
//TODO: Change that //TODO: Change that
valueDelegate.setValue("", row) bottomSheetDelegate.setValue("", row)
dismiss() dismiss()
} }

@ -18,7 +18,7 @@ class BottomSheetEditTextFragment : BottomSheetFragment() {
override fun clickOnCheck() { override fun clickOnCheck() {
super.clickOnCheck() super.clickOnCheck()
valueDelegate.setValue("", row) bottomSheetDelegate.setValue("", row)
dismiss() dismiss()
} }
@ -41,8 +41,6 @@ class BottomSheetEditTextFragment : BottomSheetFragment() {
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_edit_text, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_edit_text, view?.bottomSheetContainer, true)
} }
} }

@ -5,7 +5,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import kotlinx.android.synthetic.main.fragment_bottom_sheet.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.*
@ -29,6 +28,7 @@ interface BottomSheetInterface {
} }
interface BottomSheetDelegate { interface BottomSheetDelegate {
fun clickOnAdd(row: DynamicRowInterface)
fun setValue(value: Any, row: DynamicRowInterface) fun setValue(value: Any, row: DynamicRowInterface)
} }
@ -36,7 +36,7 @@ interface BottomSheetDelegate {
open class BottomSheetFragment : BottomSheetDialogFragment(), BottomSheetInterface { open class BottomSheetFragment : BottomSheetDialogFragment(), BottomSheetInterface {
lateinit var row: DynamicRowInterface lateinit var row: DynamicRowInterface
lateinit var valueDelegate: BottomSheetDelegate lateinit var bottomSheetDelegate: BottomSheetDelegate
private var data: ArrayList<BottomSheetData> = ArrayList() private var data: ArrayList<BottomSheetData> = ArrayList()
@ -44,7 +44,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment(), BottomSheetInterfa
fun create( fun create(
fragmentManager: FragmentManager?, fragmentManager: FragmentManager?,
row: DynamicRowInterface, row: DynamicRowInterface,
valueDelegate: BottomSheetDelegate, bottomSheetDelegate: BottomSheetDelegate,
data: ArrayList<BottomSheetData> data: ArrayList<BottomSheetData>
): BottomSheetFragment { ): BottomSheetFragment {
@ -58,20 +58,14 @@ open class BottomSheetFragment : BottomSheetDialogFragment(), BottomSheetInterfa
bottomSheetFragment.show(fragmentManager, "bottomSheet") bottomSheetFragment.show(fragmentManager, "bottomSheet")
bottomSheetFragment.row = row bottomSheetFragment.row = row
bottomSheetFragment.valueDelegate = valueDelegate bottomSheetFragment.bottomSheetDelegate = bottomSheetDelegate
bottomSheetFragment.data = data bottomSheetFragment.data = data
return bottomSheetFragment return bottomSheetFragment
} }
} }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate( return inflater.inflate(R.layout.fragment_bottom_sheet,container,false)
net.pokeranalytics.android.R.layout.fragment_bottom_sheet,
container,
false
) as ConstraintLayout
return view
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -93,6 +87,8 @@ open class BottomSheetFragment : BottomSheetDialogFragment(), BottomSheetInterfa
} }
override fun clickOnAdd() { override fun clickOnAdd() {
when (row) {
}
} }
/** /**
@ -113,7 +109,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment(), BottomSheetInterfa
true true
} }
bottomSheetToolbar.menu.findItem(R.id.actionAdd).setOnMenuItemClickListener { bottomSheetToolbar.menu.findItem(R.id.actionAdd).setOnMenuItemClickListener {
clickOnAdd() bottomSheetDelegate.clickOnAdd(row)
true true
} }
bottomSheetToolbar.menu.findItem(R.id.actionCheck).setOnMenuItemClickListener { bottomSheetToolbar.menu.findItem(R.id.actionCheck).setOnMenuItemClickListener {

@ -3,7 +3,9 @@ package net.pokeranalytics.android.ui.fragment.components
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.RealmResults
import kotlinx.android.synthetic.main.bottom_sheet_double_list.* import kotlinx.android.synthetic.main.bottom_sheet_double_list.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
@ -11,9 +13,13 @@ import net.pokeranalytics.android.model.realm.Game
import net.pokeranalytics.android.ui.adapter.components.DataListAdapter import net.pokeranalytics.android.ui.adapter.components.DataListAdapter
import net.pokeranalytics.android.ui.adapter.components.DisplayableDataSource import net.pokeranalytics.android.ui.adapter.components.DisplayableDataSource
import net.pokeranalytics.android.ui.adapter.components.DisplayableDelegate import net.pokeranalytics.android.ui.adapter.components.DisplayableDelegate
import timber.log.Timber
class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate { class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate {
private var realmData: RealmResults<*>? = null
private lateinit var dataAdapter: DataListAdapter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initData() initData()
@ -22,30 +28,42 @@ class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate {
override fun clickOnCheck() { override fun clickOnCheck() {
super.clickOnCheck() super.clickOnCheck()
valueDelegate.setValue("", row) bottomSheetDelegate.setValue("", row)
dismiss() dismiss()
} }
override fun onStart() { override fun onResume() {
super.onStart() super.onResume()
dataAdapter.notifyDataSetChanged()
} }
override fun data(position: Int): DisplayableDataSource { override fun data(position: Int): DisplayableDataSource {
realmData?.let {
return it[position] as DisplayableDataSource
}
//TODO: Change that
return Game() return Game()
} }
override fun onRowSelected(position: Int) { override fun onRowSelected(position: Int) {
realmData?.let {
Toast.makeText(requireContext(), "Select: ${it[position]}", Toast.LENGTH_SHORT).show()
}
} }
override fun size(): Int { override fun size(): Int {
return 0 return realmData?.size ?: 0
} }
/** /**
* Init data * Init data
*/ */
private fun initData() { private fun initData() {
val data = getData()
val bottomSheetData = getData()
if (bottomSheetData.isNotEmpty() && bottomSheetData.first().data != null) {
this.realmData = bottomSheetData.first().data
}
} }
/** /**
@ -56,7 +74,7 @@ class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate {
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_list, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_list, view?.bottomSheetContainer, true)
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
val dataAdapter = DataListAdapter(this, R.layout.row_bottom_sheet_title) dataAdapter = DataListAdapter(this, R.layout.row_bottom_sheet_title)
gameNameRecyclerView.apply { gameNameRecyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)

@ -1,13 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content">
android:orientation="horizontal">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/gameNameRecyclerView" android:id="@+id/gameNameRecyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="200dp" />
android:minHeight="200dp" />
</LinearLayout> </FrameLayout>

@ -1,28 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/gray_dark"> android:background="@color/gray_dark">
<androidx.appcompat.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/bottomSheetToolbar" android:id="@+id/bottomSheetToolbar"
android:layout_width="0dp"
style="@style/PokerAnalyticsTheme.Toolbar" style="@style/PokerAnalyticsTheme.Toolbar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize" android:layout_height="?actionBarSize"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:title="Test" /> tools:title="Test" />
<FrameLayout <FrameLayout
android:id="@+id/bottomSheetContainer" android:id="@+id/bottomSheetContainer"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content" />
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/bottomSheetToolbar" />
</androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout>

@ -4,8 +4,8 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:background="@color/kaki_medium"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/kaki_light"
android:foreground="?selectableItemBackground" android:foreground="?selectableItemBackground"
android:padding="8dp"> android:padding="8dp">

@ -1,27 +1,26 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?selectableItemBackground" android:background="?selectableItemBackground"
android:id="@+id/container"
android:padding="16dp"> android:padding="16dp">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title" android:id="@+id/title"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:textSize="20sp" android:textSize="20sp"
tools:text="Data Type Title" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp" app:layout_constraintTop_toTopOf="parent"
android:layout_marginBottom="8dp" tools:text="Data Type Title" />
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

@ -26,7 +26,6 @@
<color name="kaki">#3b4a39</color> <color name="kaki">#3b4a39</color>
<color name="kaki_medium">#57815a</color> <color name="kaki_medium">#57815a</color>
<color name="kaki_light">#657d60</color> <color name="kaki_light">#657d60</color>
<color name="kaki_lighter">#9bae8d</color> <color name="kaki_lighter">#9bae8d</color>

@ -1,11 +1,9 @@
package net.pokeranalytics.android package net.pokeranalytics.android
import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.model.realm.SessionSet
import org.junit.Assert.fail import org.junit.Assert.fail
import org.junit.Test import org.junit.Test
import java.util.*
/** /**
* Example local unit test, which will execute on the development machine (host). * Example local unit test, which will execute on the development machine (host).
@ -27,7 +25,7 @@ class ExampleUnitTest : RealmUnitTest() {
} }
// @Test @Test
fun testStats() { fun testStats() {
val grades: List<Grade> = listOf(Grade(10.0), Grade(20.0)) val grades: List<Grade> = listOf(Grade(10.0), Grade(20.0))
@ -51,61 +49,5 @@ class ExampleUnitTest : RealmUnitTest() {
} }
// convenience extension
fun Session.Companion.testInstance(netResult: Double, startDate: Date, endDate: Date?): Session {
var session: Session = Session.newInstance()
session.result?.netResult = netResult
session.timeFrame?.setDate(startDate, endDate)
return session
}
@Test
fun testSessionStats() {
val realm = RealmUnitTest.realmInstance()
realm.beginTransaction()
Calendar.getInstance().set(2019,1,1,10,0)
val sd1 = Calendar.getInstance().time
Calendar.getInstance().set(2019,1,1,11,0)
val ed1 = Calendar.getInstance().time
val s1 = Session.testInstance(-100.0, sd1, ed1)
Calendar.getInstance().set(2019,1,2,8,0)
val sd2 = Calendar.getInstance().time
Calendar.getInstance().set(2019,1,2,11,0)
val ed2 = Calendar.getInstance().time
val s2 = Session.testInstance(300.0, sd2, ed2)
val sessions: List<Session> = listOf(s1, s2)
val group = SessionGroup(name = "test", sessions = sessions)
realm.commitTransaction()
val results: ComputedResults = Calculator.compute(group, Calculator.Options())
val sum = results.computedStat(Stat.NETRESULT)
if (sum != null) {
assert(sum.value == 200.0) { "sum is ${sum.value}" }
} else {
fail("No Net result stat")
}
val average = results.computedStat(Stat.AVERAGE)
if (average != null) {
assert(average.value == 100.0) { "average is ${average.value}" }
} else {
fail("No AVERAGE stat")
}
val duration = results.computedStat(Stat.DURATION)
if (duration != null) {
assert(duration.value == 4.0) { "duration is ${duration.value}" }
} else {
fail("No AVERAGE stat")
}
}
} }

@ -1,22 +1,25 @@
package net.pokeranalytics.android package net.pokeranalytics.android
//import androidx.test.core.app.ApplicationProvider
import io.realm.Realm import io.realm.Realm
import io.realm.RealmConfiguration import io.realm.RealmConfiguration
import org.junit.After
import org.junit.Before
open class RealmUnitTest { open class RealmUnitTest {
companion object { lateinit var mockRealm: Realm
fun realmInstance() : Realm { @Before
fun setup() {
// Application
// Realm.init(ApplicationProvider.getApplicationContext<PokerAnalyticsApplication>())
val testConfig = RealmConfiguration.Builder().inMemory().name("test-realm").build() val testConfig = RealmConfiguration.Builder().inMemory().name("test-realm").build()
return Realm.getInstance(testConfig) Realm.setDefaultConfiguration(testConfig)
mockRealm = Realm.getDefaultInstance()
} }
@After
@Throws(Exception::class)
public fun tearDown() {
mockRealm.close()
} }
} }
Loading…
Cancel
Save