diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2145a55a..d833681a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -71,6 +71,11 @@
android:launchMode="singleTop"
android:screenOrientation="portrait" />
+
+
{
+ val rows: MutableList = mutableListOf()
+
+ var potSize = 0.0
+ Street.values().forEach { street ->
+ rows.add(StreetHeader(street, this.handHistory.cardsForStreet(street), potSize))
+ val actions = this.sortedActions.filter { it.action.street == street.ordinal }
+ rows.addAll(actions)
+ potSize = actions.last().totalPotSize
+ }
+
+ return rows
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/net/pokeranalytics/android/model/handhistory/Street.kt b/app/src/main/java/net/pokeranalytics/android/model/handhistory/Street.kt
index b4120df6..f823dd0c 100644
--- a/app/src/main/java/net/pokeranalytics/android/model/handhistory/Street.kt
+++ b/app/src/main/java/net/pokeranalytics/android/model/handhistory/Street.kt
@@ -4,6 +4,16 @@ enum class Street {
PREFLOP,
FLOP,
TURN,
- RIVER
+ RIVER;
+
+ val totalBoardCards: Int
+ get() {
+ return when (this) {
+ PREFLOP -> 0
+ FLOP -> 3
+ TURN -> 4
+ RIVER -> 5
+ }
+ }
}
diff --git a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
index 843db86c..cbdec38b 100644
--- a/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
+++ b/app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
@@ -191,6 +191,7 @@ class PokerAnalyticsMigration : RealmMigration {
val cardSchema = schema.create("Card")
cardSchema.addField("value", Int::class.java)
cardSchema.addField("suit", Int::class.java)
+ cardSchema.addField("index", Int::class.java)
hhSchema.addRealmListField("board", cardSchema)
val actionSchema = schema.create("Action")
diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt
index 68637116..1273ba7e 100644
--- a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt
+++ b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt
@@ -22,4 +22,9 @@ open class Card : RealmObject() {
*/
var suit: Int = 0
+ /***
+ * The card index in a list
+ */
+ var index: Int = 0
+
}
\ No newline at end of file
diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt
index 6647bcbb..1242fe1d 100644
--- a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt
+++ b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt
@@ -2,16 +2,22 @@ package net.pokeranalytics.android.model.realm.handhistory
import io.realm.RealmList
import io.realm.RealmObject
+import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.handhistory.HandSetup
+import net.pokeranalytics.android.model.handhistory.Street
+import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.realm.Session
import java.util.*
-open class HandHistory : RealmObject() {
+open class HandHistory : RealmObject(), Identifiable {
@PrimaryKey
- var id = UUID.randomUUID().toString()
+ override var id = UUID.randomUUID().toString()
+
+ @Ignore
+ override val realmObjectClass: Class = HandHistory::class.java
/***
* The date of the hand history
@@ -92,13 +98,15 @@ open class HandHistory : RealmObject() {
action.type = Action.Type.POST_BB
action.amount = this.bigBlind
}
- else -> {
-
- }
+ else -> {}
}
this.actions.add(action)
}
}
+ fun cardsForStreet(street: Street): List {
+ return this.board.sortedBy { it.index }.drop(street.totalBoardCards)
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HandHistoryActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HandHistoryActivity.kt
new file mode 100644
index 00000000..522eb07d
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HandHistoryActivity.kt
@@ -0,0 +1,48 @@
+package net.pokeranalytics.android.ui.activity
+
+import android.content.Intent
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import net.pokeranalytics.android.R
+import net.pokeranalytics.android.ui.activity.components.BaseActivity
+import net.pokeranalytics.android.ui.activity.components.RequestCode
+import net.pokeranalytics.android.ui.fragment.HandHistoryFragment
+
+class HandHistoryActivity : BaseActivity() {
+
+ enum class IntentKey(val keyName: String) {
+ IDENTIFIER("identifier")
+ }
+
+ companion object {
+
+ fun newInstance(fragment: Fragment, id: String?) {
+ val intent = Intent(fragment.requireContext(), DataListActivity::class.java)
+ id?.let { intent.putExtra(IntentKey.IDENTIFIER.keyName, it) }
+ fragment.startActivityForResult(intent, RequestCode.NEW_HAND_HISTORY.value)
+ }
+
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_hand_history)
+
+ initUI()
+ }
+
+ /**
+ * Init UI
+ */
+ private fun initUI() {
+
+ val fragmentTransaction = supportFragmentManager.beginTransaction()
+
+ val handHistoryId = intent.getStringExtra(IntentKey.IDENTIFIER.keyName)
+ val fragment = HandHistoryFragment.newInstance(handHistoryId)
+ fragmentTransaction.add(R.id.container, fragment)
+ fragmentTransaction.commit()
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/Codes.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/Codes.kt
index 8ea9aa87..3a5465a8 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/Codes.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/Codes.kt
@@ -10,6 +10,7 @@ enum class RequestCode(var value: Int) {
NEW_SESSION(800),
NEW_TRANSACTION(801),
NEW_REPORT(802),
+ NEW_HAND_HISTORY(803),
IMPORT(900),
SUBSCRIPTION(901),
CURRENCY(902),
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HandHistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HandHistoryFragment.kt
new file mode 100644
index 00000000..7dd4fe74
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HandHistoryFragment.kt
@@ -0,0 +1,112 @@
+package net.pokeranalytics.android.ui.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.lifecycle.ViewModelProviders
+import androidx.recyclerview.widget.LinearLayoutManager
+import kotlinx.android.synthetic.main.fragment_settings.*
+import net.pokeranalytics.android.R
+import net.pokeranalytics.android.exceptions.PAIllegalStateException
+import net.pokeranalytics.android.model.handhistory.HHBuilder
+import net.pokeranalytics.android.model.handhistory.HandSetup
+import net.pokeranalytics.android.model.realm.handhistory.HandHistory
+import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
+import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
+import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
+import net.pokeranalytics.android.ui.fragment.components.RealmFragment
+import net.pokeranalytics.android.ui.view.RowRepresentable
+import net.pokeranalytics.android.ui.viewmodel.HandHistoryViewModel
+import net.pokeranalytics.android.util.extensions.findById
+
+class HandHistoryFragment : RealmFragment(), RowRepresentableDataSource, RowRepresentableDelegate {
+
+ private lateinit var model: HandHistoryViewModel
+
+ private lateinit var handHistoryAdapter: RowRepresentableAdapter
+
+ private var rows: List = listOf()
+
+ companion object {
+
+ fun newInstance(id: String? = null): HandHistoryFragment {
+ val fragment = HandHistoryFragment()
+ val bundle = Bundle()
+ bundle.putSerializable(BundleKey.PRIMARY_KEY.value, id)
+ fragment.arguments = bundle
+ return fragment
+ }
+
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ model = activity?.run {
+ ViewModelProviders.of(this)[HandHistoryViewModel::class.java]
+ } ?: throw Exception("Invalid Activity")
+
+ }
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ return inflater.inflate(R.layout.fragment_hand_history, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initData()
+ initUI()
+ }
+
+ private fun initData() {
+
+ val handHistoryId = this.arguments?.getString(BundleKey.PRIMARY_KEY.value)
+ val builder = handHistoryId?.let {
+ val handHistory = getRealm().findById(it) ?: throw PAIllegalStateException("HandHistory not found")
+ HHBuilder(handHistory)
+ } ?: run {
+ HHBuilder(HandSetup())
+ }
+ this.model.setBuilder(builder)
+
+ }
+
+ private fun initUI() {
+
+ setToolbarTitle(getString(R.string.hand_history))
+
+ setDisplayHomeAsUpEnabled(true)
+
+ val viewManager = LinearLayoutManager(requireContext())
+ handHistoryAdapter = RowRepresentableAdapter(this, this)
+
+ recyclerView.apply {
+ setHasFixedSize(true)
+ layoutManager = viewManager
+ adapter = handHistoryAdapter
+ }
+
+ this.rows = this.model.builder.value?.rowRepresentables() ?: listOf()
+
+ }
+
+ // RowRepresentableDataSource
+
+ override fun adapterRows(): List? {
+ return this.rows
+ }
+
+ override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
+ return this.rows[position]
+ }
+
+ override fun numberOfRows(): Int {
+ return this.rows.size
+ }
+
+ override fun viewTypeForPosition(position: Int): Int {
+ return this.rows[position].viewType
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
index 08093edb..f957f5d2 100644
--- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
+++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
@@ -94,6 +94,8 @@ enum class RowViewType(private var layoutRes: Int) {
LIST(R.layout.row_list),
ROW_PLAYER(R.layout.row_player),
ROW_PLAYER_IMAGE(R.layout.row_player_image),
+ ROW_HAND_ACTION(R.layout.row_hand_action),
+ ROW_HAND_STREET(R.layout.row_hand_street),
// Separator
SEPARATOR(R.layout.row_separator);
@@ -142,6 +144,10 @@ enum class RowViewType(private var layoutRes: Int) {
GRAPH -> GraphViewHolder(layout)
LEGEND_DEFAULT -> LegendDefaultViewHolder(layout)
+ // Hand History
+ ROW_HAND_ACTION -> RowHandAction(layout)
+ ROW_HAND_STREET -> RowHandStreet(layout)
+
// Separator
SEPARATOR -> SeparatorViewHolder(layout)
@@ -675,6 +681,24 @@ enum class RowViewType(private var layoutRes: Int) {
}
}
+ /**
+ * Display a hand action
+ */
+ inner class RowHandAction(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
+ override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
+
+ }
+ }
+
+ /**
+ * Display a hand street
+ */
+ inner class RowHandStreet(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
+ override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
+
+ }
+ }
+
/**
* Display a separator
*/
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/StreetHeader.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/StreetHeader.kt
new file mode 100644
index 00000000..dde88bbf
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/StreetHeader.kt
@@ -0,0 +1,9 @@
+package net.pokeranalytics.android.ui.view.handhistory
+
+import net.pokeranalytics.android.model.handhistory.Street
+import net.pokeranalytics.android.model.realm.handhistory.Card
+import net.pokeranalytics.android.ui.view.RowRepresentable
+
+class StreetHeader(var street: Street, var cards: List, var potSize: Double) : RowRepresentable {
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/HandHistoryViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/HandHistoryViewModel.kt
new file mode 100644
index 00000000..87c7bb21
--- /dev/null
+++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/HandHistoryViewModel.kt
@@ -0,0 +1,19 @@
+package net.pokeranalytics.android.ui.viewmodel
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import net.pokeranalytics.android.model.handhistory.HHBuilder
+
+class HandHistoryViewModel : ViewModel() {
+
+ var builder = MutableLiveData()
+
+ fun setBuilder(builder: HHBuilder) {
+ this.builder.value = builder
+ }
+
+ fun test() {
+// this.builder.
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_hand_history.xml b/app/src/main/res/layout/activity_hand_history.xml
new file mode 100644
index 00000000..3451ec02
--- /dev/null
+++ b/app/src/main/res/layout/activity_hand_history.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_hand_history.xml b/app/src/main/res/layout/fragment_hand_history.xml
new file mode 100644
index 00000000..51122938
--- /dev/null
+++ b/app/src/main/res/layout/fragment_hand_history.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/row_hand_action.xml b/app/src/main/res/layout/row_hand_action.xml
new file mode 100644
index 00000000..3509b841
--- /dev/null
+++ b/app/src/main/res/layout/row_hand_action.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/row_hand_street.xml b/app/src/main/res/layout/row_hand_street.xml
new file mode 100644
index 00000000..3509b841
--- /dev/null
+++ b/app/src/main/res/layout/row_hand_street.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file