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. 50
      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. 43
      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. 23
      app/src/test/java/net/pokeranalytics/android/RealmUnitTest.kt

@ -61,11 +61,24 @@ dependencies {
implementation 'com.jakewharton.timber:timber:4.7.1'
// Test
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:core:1.1.0'
androidTestImplementation 'androidx.test:core:1.0.0'
androidTestImplementation 'androidx.test:runner: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'

@ -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 gIndex = 0; var gSum = 0.0; var gTotalHands = 0.0; var gBBSum = 0.0;
sessionSets.forEach { group ->
sessionSets.forEach { sessionSet ->
gIndex++
duration += group.duration
gSum += group.netResult
gTotalHands += group.estimatedHands
gBBSum += group.bbNetResult
duration += sessionSet.hourlyDuration
gSum += sessionSet.netResult
gTotalHands += sessionSet.estimatedHands
gBBSum += sessionSet.bbNetResult
hourlyRate = gSum / 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(hourlyRate, duration, HOURLY_RATE)
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(hourlyRateBB, duration, HOURLY_RATE_BB)
}

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

@ -11,7 +11,6 @@ import net.pokeranalytics.android.util.data.sessionDao
import java.util.*
import kotlin.collections.ArrayList
open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, DisplayableDataSource, EditableDataSource {
@PrimaryKey
@ -148,14 +147,20 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
override var title: String = "Change that: $creationDate"
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>()
// Todo: Localize & set real data
when (row) {
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 -> {
data.add(BottomSheetData(timeFrame?.startDate, "Start date"))

@ -1,5 +1,6 @@
package net.pokeranalytics.android.model.realm
import io.realm.Realm
import io.realm.RealmList
import io.realm.RealmObject
import io.realm.annotations.Ignore
@ -14,7 +15,16 @@ open class SessionSet() : RealmObject() {
var sessions: RealmList<Session> = RealmList()
@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
var netResult: Double = 0.0
@ -30,9 +40,9 @@ open class SessionSet() : RealmObject() {
companion object {
fun newInstance() : SessionSet {
val sessionSet: SessionSet = SessionSet()
sessionSet.timeFrame = TimeFrame()
fun newInstance(realm: Realm) : SessionSet {
val sessionSet: SessionSet = realm.createObject(SessionSet::class.java)
sessionSet.timeFrame = realm.createObject(TimeFrame::class.java)
return sessionSet
}

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

@ -5,36 +5,36 @@ import android.content.Intent
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_editable_data.*
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.fragment.EditableDataFragment
class EditableDataActivity : PokerAnalyticsActivity() {
companion object {
fun newInstance(context: Context, dataType: Int, primaryKey:String?) {
val intent = Intent(context, EditableDataActivity::class.java)
intent.putExtra("dataType", dataType)
primaryKey?.let {
intent.putExtra("primaryKey", it)
}
context.startActivity(intent)
}
}
companion object {
fun newInstance(context: Context, dataType: Int, primaryKey: String? = null) {
val intent = Intent(context, EditableDataActivity::class.java)
intent.putExtra("dataType", dataType)
primaryKey?.let {
intent.putExtra("primaryKey", it)
}
context.startActivity(intent)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_editable_data)
initUI()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_editable_data)
initUI()
}
/**
* Init UI
*/
private fun initUI() {
/**
* Init UI
*/
private fun initUI() {
val dataType = intent.getIntExtra("dataType", 0)
val primaryKey = intent.getStringExtra("primaryKey")
val fragment = editableDataFragment as EditableDataFragment
fragment.setData(dataType, primaryKey)
}
val dataType = intent.getIntExtra("dataType", 0)
val primaryKey = intent.getStringExtra("primaryKey")
val fragment = editableDataFragment as EditableDataFragment
fragment.setData(dataType, primaryKey)
}
}

@ -6,7 +6,7 @@ import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout
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.ui.fragment.components.BottomSheetData
@ -22,7 +22,7 @@ interface DisplayableDataSource {
}
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>() {

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

@ -8,7 +8,6 @@ import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.Realm
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.view.*
import net.pokeranalytics.android.R
@ -41,6 +40,10 @@ class EditableDataFragment : PokerAnalyticsFragment(), DynamicRowCallback, Botto
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) {
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 net.pokeranalytics.android.R
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.adapter.components.DynamicListAdapter
import net.pokeranalytics.android.ui.adapter.components.DynamicRowCallback
import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface
import net.pokeranalytics.android.ui.adapter.components.*
import net.pokeranalytics.android.ui.fragment.components.BottomSheetDelegate
import net.pokeranalytics.android.ui.fragment.components.BottomSheetFragment
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
@ -32,17 +31,19 @@ class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, BottomS
}
override fun onRowSelected(row: DynamicRowInterface) {
/*
val data = when (row.bottomSheetType) {
BottomSheetType.BLINDS -> newSession
BottomSheetType.DATE -> newSession.timeFrame
BottomSheetType.GAME -> newSession.game
else -> Any()
val data = newSession.getBottomSheetData(row, getRealm())
BottomSheetFragment.create(fragmentManager, row, this, data)
}
override fun clickOnAdd(row: DynamicRowInterface) {
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) {

@ -1,11 +1,11 @@
package net.pokeranalytics.android.ui.fragment.components
import android.text.InputType
import net.pokeranalytics.android.ui.adapter.components.DisplayableDataSource
import io.realm.RealmResults
class BottomSheetData(
var defaultValue: Any? = null,
var hint: String? = "",
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() {
super.clickOnCheck()
//TODO: Change that
valueDelegate.setValue("", row)
bottomSheetDelegate.setValue("", row)
dismiss()
}

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

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

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

@ -3,7 +3,9 @@ package net.pokeranalytics.android.ui.fragment.components
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.RealmResults
import kotlinx.android.synthetic.main.bottom_sheet_double_list.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
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.DisplayableDataSource
import net.pokeranalytics.android.ui.adapter.components.DisplayableDelegate
import timber.log.Timber
class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate {
private var realmData: RealmResults<*>? = null
private lateinit var dataAdapter: DataListAdapter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initData()
@ -22,30 +28,42 @@ class BottomSheetListFragment : BottomSheetFragment(), DisplayableDelegate {
override fun clickOnCheck() {
super.clickOnCheck()
valueDelegate.setValue("", row)
bottomSheetDelegate.setValue("", row)
dismiss()
}
override fun onStart() {
super.onStart()
override fun onResume() {
super.onResume()
dataAdapter.notifyDataSetChanged()
}
override fun data(position: Int): DisplayableDataSource {
realmData?.let {
return it[position] as DisplayableDataSource
}
//TODO: Change that
return Game()
}
override fun onRowSelected(position: Int) {
realmData?.let {
Toast.makeText(requireContext(), "Select: ${it[position]}", Toast.LENGTH_SHORT).show()
}
}
override fun size(): Int {
return 0
return realmData?.size ?: 0
}
/**
* Init data
*/
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)
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 {
setHasFixedSize(true)

@ -1,13 +1,11 @@
<?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_height="match_parent"
android:orientation="horizontal">
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/gameNameRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="200dp" />
android:layout_height="200dp" />
</LinearLayout>
</FrameLayout>

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

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

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

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

@ -1,11 +1,9 @@
package net.pokeranalytics.android
import net.pokeranalytics.android.calculus.*
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.SessionSet
import org.junit.Assert.fail
import org.junit.Test
import java.util.*
/**
* Example local unit test, which will execute on the development machine (host).
@ -27,7 +25,7 @@ class ExampleUnitTest : RealmUnitTest() {
}
// @Test
@Test
fun testStats() {
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
//import androidx.test.core.app.ApplicationProvider
import io.realm.Realm
import io.realm.RealmConfiguration
import org.junit.After
import org.junit.Before
open class RealmUnitTest {
companion object {
lateinit var mockRealm: Realm
fun realmInstance() : Realm {
// Application
// Realm.init(ApplicationProvider.getApplicationContext<PokerAnalyticsApplication>())
val testConfig = RealmConfiguration.Builder().inMemory().name("test-realm").build()
return Realm.getInstance(testConfig)
}
@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()
}
}
Loading…
Cancel
Save