Merge branch 'master' of gitlab.com:stax-river/poker-analytics

dev_raz_wip
Razmig Sarkissian 7 years ago
commit 306a2b5407
  1. 6
      app/build.gradle
  2. 11
      app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt
  3. 7
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  4. 2
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicRowInterface.kt
  5. 7
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDateFragment.kt
  6. 60
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDoubleEditTextFragment.kt
  7. 28
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDoubleListFragment.kt
  8. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetFragment.kt
  9. 42
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetListFragment.kt
  10. 0
      app/src/main/res/layout/bottom_sheet_double_edit_text.xml
  11. 0
      app/src/main/res/layout/bottom_sheet_double_list.xml
  12. 13
      app/src/main/res/layout/bottom_sheet_list.xml
  13. 43
      app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt
  14. 22
      app/src/test/java/net/pokeranalytics/android/RealmUnitTest.kt

@ -62,8 +62,10 @@ dependencies {
// Test // Test
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0-alpha4' androidTestImplementation 'androidx.test:core:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4' androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test:rules:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
} }
apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.gms.google-services'

@ -28,8 +28,9 @@ class Calculator {
fun shouldComputeStandardDeviation() : Boolean { fun shouldComputeStandardDeviation() : Boolean {
this.displayedStats.forEach { stat -> this.displayedStats.forEach { stat ->
when (stat) { return when (stat) {
STANDARD_DEVIATION, STANDARD_DEVIATION_HOURLY, STANDARD_DEVIATION_BB_PER_100_HANDS -> return true STANDARD_DEVIATION, STANDARD_DEVIATION_HOURLY, STANDARD_DEVIATION_BB_PER_100_HANDS -> true
else -> false
} }
} }
return false return false
@ -72,7 +73,8 @@ class Calculator {
fun compute(sessionGroup: SessionGroup, options: Options) : ComputedResults { fun compute(sessionGroup: SessionGroup, options: Options) : ComputedResults {
val sessions: List<SessionInterface> = sessionGroup.sessions val sessions: List<SessionInterface> = sessionGroup.sessions
val sessionSets: Set<SessionSet> = setOf() // @todo get unique list of serie var sessionSets = sessionGroup.sessions.mapNotNull { it.sessionSet }.toHashSet()
var results: ComputedResults = ComputedResults() var results: ComputedResults = ComputedResults()
var sum: Double = 0.0 var sum: Double = 0.0
@ -98,7 +100,6 @@ class Calculator {
if (options.evolutionValues == Options.EvolutionValues.STANDARD) { if (options.evolutionValues == Options.EvolutionValues.STANDARD) {
results.addEvolutionValue(sum, NETRESULT) results.addEvolutionValue(sum, NETRESULT)
results.addEvolutionValue(sum / index, AVERAGE) results.addEvolutionValue(sum / index, AVERAGE)
results.addEvolutionValue(index.toDouble(), NUMBER_OF_GAMES) results.addEvolutionValue(index.toDouble(), NUMBER_OF_GAMES)
@ -138,7 +139,7 @@ class Calculator {
} }
} }
val average: Double = sum / sessions.size val average: Double = sum / sessions.size.toDouble()
// Create stats // Create stats
results.addStats(setOf( results.addStats(setOf(

@ -91,12 +91,6 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
return session return session
} }
fun testInstance(netResult: Double): Session {
var session: Session = Session.newInstance()
session.result?.netResult = netResult
return session
}
} }
@Ignore // SessionInterface value @Ignore // SessionInterface value
@ -141,7 +135,6 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
} }
override fun boolForRow(row: DynamicRowInterface): Boolean { override fun boolForRow(row: DynamicRowInterface): Boolean {
return false return false
} }

@ -54,7 +54,7 @@ enum class SessionRow(val resId: Int) : DynamicRowInterface {
override var bottomSheetType: BottomSheetType = BottomSheetType.NONE override var bottomSheetType: BottomSheetType = BottomSheetType.NONE
get() { get() {
return when (this) { return when (this) {
BLINDS -> BottomSheetType.LIST BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT
GAME -> BottomSheetType.DOUBLE_LIST GAME -> BottomSheetType.DOUBLE_LIST
DATE -> BottomSheetType.DATE DATE -> BottomSheetType.DATE
} }

@ -6,12 +6,9 @@ import android.view.View
import kotlinx.android.synthetic.main.bottom_sheet_date.* import kotlinx.android.synthetic.main.bottom_sheet_date.*
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
import net.pokeranalytics.android.model.realm.TimeFrame
class BottomSheetDateFragment : BottomSheetFragment() { class BottomSheetDateFragment : BottomSheetFragment() {
private var timeFrame: TimeFrame = TimeFrame()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initData() initData()
@ -20,7 +17,8 @@ class BottomSheetDateFragment : BottomSheetFragment() {
override fun clickOnCheck() { override fun clickOnCheck() {
super.clickOnCheck() super.clickOnCheck()
valueDelegate.setValue(timeFrame, row) //TODO: Change that
valueDelegate.setValue("", row)
dismiss() dismiss()
} }
@ -29,7 +27,6 @@ class BottomSheetDateFragment : BottomSheetFragment() {
*/ */
private fun initData() { private fun initData() {
val data = getData() val data = getData()
timeFrame = if (data is TimeFrame) data else TimeFrame()
} }
/** /**

@ -0,0 +1,60 @@
package net.pokeranalytics.android.ui.fragment.components
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import kotlinx.android.synthetic.main.bottom_sheet_double_edit_text.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Game
import net.pokeranalytics.android.ui.adapter.components.DisplayableDataSource
import net.pokeranalytics.android.ui.adapter.components.DisplayableDelegate
class BottomSheetDoubleEditTextFragment : BottomSheetFragment(), DisplayableDelegate {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initData()
initUI()
}
override fun clickOnCheck() {
super.clickOnCheck()
valueDelegate.setValue("", row)
dismiss()
}
override fun onStart() {
super.onStart()
smallBlind.requestFocus()
}
override fun data(position: Int): DisplayableDataSource {
return Game()
}
override fun onRowSelected(position: Int) {
}
override fun size(): Int {
return 0
}
/**
* Init data
*/
private fun initData() {
val data = getData()
}
/**
* Init UI
*/
private fun initUI() {
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_double_edit_text, view?.bottomSheetContainer, true)
}
}

@ -1,23 +1,20 @@
package net.pokeranalytics.android.ui.fragment.components package net.pokeranalytics.android.ui.fragment.components
import android.content.Context
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 androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.bottom_sheet_game.* 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
import net.pokeranalytics.android.model.realm.Game 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 net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface
class BottomSheetDoubleListFragment : BottomSheetFragment(), DisplayableDelegate { class BottomSheetDoubleListFragment : BottomSheetFragment(), DisplayableDelegate {
private var game: Game = Game()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -27,12 +24,14 @@ class BottomSheetDoubleListFragment : BottomSheetFragment(), DisplayableDelegate
override fun clickOnCheck() { override fun clickOnCheck() {
super.clickOnCheck() super.clickOnCheck()
valueDelegate.setValue(game, row) //TODO: Change that
valueDelegate.setValue("", row)
dismiss() dismiss()
} }
override fun data(position: Int): DisplayableDataSource { override fun data(position: Int): DisplayableDataSource {
return game //TODO: Change that
return Game()
} }
override fun onRowSelected(position: Int) { override fun onRowSelected(position: Int) {
@ -47,15 +46,15 @@ class BottomSheetDoubleListFragment : BottomSheetFragment(), DisplayableDelegate
*/ */
private fun initData() { private fun initData() {
val data = getData() val data = getData()
game = if (data is Game) data else Game() //game = if (data is Game) data else Game()
game.title = "Test" //game.title = "Test"
} }
/** /**
* Init UI * Init UI
*/ */
private fun initUI() { private fun initUI() {
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_game, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_double_list, view?.bottomSheetContainer, true)
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
val dataAdapter = DataListAdapter(this, R.layout.row_bottom_sheet_title) val dataAdapter = DataListAdapter(this, R.layout.row_bottom_sheet_title)
@ -65,17 +64,6 @@ class BottomSheetDoubleListFragment : BottomSheetFragment(), DisplayableDelegate
layoutManager = viewManager layoutManager = viewManager
adapter = dataAdapter adapter = dataAdapter
} }
}
inner class TitleObject(var title: String) : DynamicRowInterface {
override fun localizedTitle(context: Context): String {
return title
}
override var viewType: Int = 0
override var bottomSheetType: BottomSheetType = BottomSheetType.NONE
} }
} }

@ -52,6 +52,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment(), BottomSheetInterfa
BottomSheetType.DATE -> BottomSheetDateFragment() BottomSheetType.DATE -> BottomSheetDateFragment()
BottomSheetType.LIST -> BottomSheetListFragment() BottomSheetType.LIST -> BottomSheetListFragment()
BottomSheetType.DOUBLE_LIST -> BottomSheetDoubleListFragment() BottomSheetType.DOUBLE_LIST -> BottomSheetDoubleListFragment()
BottomSheetType.DOUBLE_EDIT_TEXT -> BottomSheetDoubleEditTextFragment()
else -> BottomSheetFragment() else -> BottomSheetFragment()
} }

@ -3,15 +3,16 @@ 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.view.inputmethod.EditorInfo import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.bottom_sheet_blinds.* 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
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Game
import net.pokeranalytics.android.ui.adapter.components.DataListAdapter
import net.pokeranalytics.android.ui.adapter.components.DisplayableDataSource
import net.pokeranalytics.android.ui.adapter.components.DisplayableDelegate
class BottomSheetListFragment : BottomSheetFragment() { class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate {
private var session: Session = Session()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -21,13 +22,23 @@ class BottomSheetListFragment : BottomSheetFragment() {
override fun clickOnCheck() { override fun clickOnCheck() {
super.clickOnCheck() super.clickOnCheck()
valueDelegate.setValue(session, row) valueDelegate.setValue("", row)
dismiss() dismiss()
} }
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
smallBlind.requestFocus() }
override fun data(position: Int): DisplayableDataSource {
return Game()
}
override fun onRowSelected(position: Int) {
}
override fun size(): Int {
return 0
} }
/** /**
@ -35,7 +46,6 @@ class BottomSheetListFragment : BottomSheetFragment() {
*/ */
private fun initData() { private fun initData() {
val data = getData() val data = getData()
session = if (data is Session) data else Session()
} }
/** /**
@ -43,13 +53,15 @@ class BottomSheetListFragment : BottomSheetFragment() {
*/ */
private fun initUI() { private fun initUI() {
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_blinds, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_list, view?.bottomSheetContainer, true)
bigBlind.setOnEditorActionListener { v, actionId, event -> val viewManager = LinearLayoutManager(requireContext())
if (actionId == EditorInfo.IME_ACTION_DONE) { val dataAdapter = DataListAdapter(this, R.layout.row_bottom_sheet_title)
clickOnCheck()
} gameNameRecyclerView.apply {
true setHasFixedSize(true)
layoutManager = viewManager
adapter = dataAdapter
} }
} }

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

@ -5,6 +5,7 @@ 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).
@ -12,7 +13,7 @@ import org.junit.Test
* See [testing documentation](http://d.android.com/tools/testing). * See [testing documentation](http://d.android.com/tools/testing).
*/ */
class ExampleUnitTest { class ExampleUnitTest : RealmUnitTest() {
class Grade(someValue: Double) : SessionInterface { class Grade(someValue: Double) : SessionInterface {
@ -26,7 +27,7 @@ class ExampleUnitTest {
} }
@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))
@ -50,24 +51,56 @@ class ExampleUnitTest {
} }
// 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 @Test
fun testSessionStats() { fun testSessionStats() {
val sessions: List<Session> = listOf(Session.testInstance(-10.0), Session.testInstance(20.0)) 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) val group = SessionGroup(name = "test", sessions = sessions)
realm.commitTransaction()
val results: ComputedResults = Calculator.compute(group, Calculator.Options()) val results: ComputedResults = Calculator.compute(group, Calculator.Options())
val sum = results.computedStat(Stat.NETRESULT) val sum = results.computedStat(Stat.NETRESULT)
if (sum != null) { if (sum != null) {
assert(sum.value == 10.0) { "sum is ${sum.value}" } assert(sum.value == 200.0) { "sum is ${sum.value}" }
} else { } else {
fail("No Net result stat") fail("No Net result stat")
} }
val average = results.computedStat(Stat.AVERAGE) val average = results.computedStat(Stat.AVERAGE)
if (average != null) { if (average != null) {
assert(average.value == 5.0) { "average is ${average.value}" } 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 { } else {
fail("No AVERAGE stat") fail("No AVERAGE stat")
} }

@ -0,0 +1,22 @@
package net.pokeranalytics.android
//import androidx.test.core.app.ApplicationProvider
import io.realm.Realm
import io.realm.RealmConfiguration
open class RealmUnitTest {
companion object {
fun realmInstance() : Realm {
// Application
// Realm.init(ApplicationProvider.getApplicationContext<PokerAnalyticsApplication>())
val testConfig = RealmConfiguration.Builder().inMemory().name("test-realm").build()
return Realm.getInstance(testConfig)
}
}
}
Loading…
Cancel
Save