From 15db3c4d3abe130e09bf892d1c9433dab7127063 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 13 Jan 2020 16:53:49 +0100 Subject: [PATCH] Adds basic UI for hand history --- app/src/main/AndroidManifest.xml | 5 + .../model/handhistory/ComputedAction.kt | 19 +-- .../handhistory/{Builder.kt => HHBuilder.kt} | 18 ++- .../android/model/handhistory/Street.kt | 12 +- .../migrations/PokerAnalyticsMigration.kt | 1 + .../android/model/realm/handhistory/Card.kt | 5 + .../model/realm/handhistory/HandHistory.kt | 18 ++- .../ui/activity/HandHistoryActivity.kt | 48 ++++++++ .../android/ui/activity/components/Codes.kt | 1 + .../ui/fragment/HandHistoryFragment.kt | 112 ++++++++++++++++++ .../android/ui/view/RowViewType.kt | 24 ++++ .../ui/view/handhistory/StreetHeader.kt | 9 ++ .../ui/viewmodel/HandHistoryViewModel.kt | 19 +++ .../main/res/layout/activity_hand_history.xml | 7 ++ .../main/res/layout/fragment_hand_history.xml | 27 +++++ app/src/main/res/layout/row_hand_action.xml | 6 + app/src/main/res/layout/row_hand_street.xml | 6 + 17 files changed, 321 insertions(+), 16 deletions(-) rename app/src/main/java/net/pokeranalytics/android/model/handhistory/{Builder.kt => HHBuilder.kt} (93%) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/HandHistoryActivity.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/HandHistoryFragment.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/handhistory/StreetHeader.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/viewmodel/HandHistoryViewModel.kt create mode 100644 app/src/main/res/layout/activity_hand_history.xml create mode 100644 app/src/main/res/layout/fragment_hand_history.xml create mode 100644 app/src/main/res/layout/row_hand_action.xml create mode 100644 app/src/main/res/layout/row_hand_street.xml 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