Adds export button + HH text export

hh
Laurent 6 years ago
parent 457cb4f95e
commit ef52c4a071
  1. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/Card.kt
  2. 110
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt
  3. 12
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/PlayerSetup.kt
  4. 39
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  6. 5
      app/src/main/java/net/pokeranalytics/android/util/extensions/StringExtensions.kt
  7. 9
      app/src/main/res/drawable/ic_get_app.xml
  8. 6
      app/src/main/res/menu/toolbar_hand_history.xml
  9. 2
      app/src/main/res/values/strings.xml

@ -124,7 +124,7 @@ open class Card : RealmObject() {
/*** /***
* Returns the formatted value of the card * Returns the formatted value of the card
*/ */
val formattedValue: String private val formattedValue: String
get() { return Value.format(this.value) } get() { return Value.format(this.value) }
/*** /***

@ -1,17 +1,23 @@
package net.pokeranalytics.android.model.realm.handhistory package net.pokeranalytics.android.model.realm.handhistory
import android.content.Context
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
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.handhistory.HandSetup import net.pokeranalytics.android.model.handhistory.HandSetup
import net.pokeranalytics.android.model.handhistory.Position import net.pokeranalytics.android.model.handhistory.Position
import net.pokeranalytics.android.model.handhistory.Street
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.TimeFilterable import net.pokeranalytics.android.model.interfaces.TimeFilterable
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.modules.handhistory.model.CardHolder import net.pokeranalytics.android.ui.modules.handhistory.model.CardHolder
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.util.extensions.addLineReturn
import net.pokeranalytics.android.util.extensions.formatted
import net.pokeranalytics.android.util.extensions.fullDate
import java.util.* import java.util.*
open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterable, TimeFilterable, open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterable, TimeFilterable,
@ -148,10 +154,10 @@ open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterab
this.actions.add(action) this.actions.add(action)
} }
// fun cardsForStreet(street: Street): MutableList<Card> { fun cardsForStreet(street: Street): MutableList<Card> {
// return this.board.sortedBy { it.index }.take(street.totalBoardCards).toMutableList() return this.board.sortedBy { it.index }.take(street.totalBoardCards).toMutableList()
// } }
//
// fun playerSetupForPosition(position: Int) : PlayerSetup { // fun playerSetupForPosition(position: Int) : PlayerSetup {
// this.playerSetups.firstOrNull { it.position == position }?.let { // this.playerSetups.firstOrNull { it.position == position }?.let {
// return it // return it
@ -182,6 +188,11 @@ open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterab
} }
} }
private val sortedActions: List<Action>
get() {
return this.actions.sortedBy { it.index }
}
fun undefinedPositions(): List<Position> { fun undefinedPositions(): List<Position> {
val positions = Position.positionsPerPlayers(this.numberOfPlayers) val positions = Position.positionsPerPlayers(this.numberOfPlayers)
val copy = positions.clone() as LinkedHashSet<Position> val copy = positions.clone() as LinkedHashSet<Position>
@ -198,4 +209,95 @@ open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterab
return playerSetup return playerSetup
} }
/***
* Returns the pot size at the start of the given [street]
*/
fun potSizeForStreet(street: Street): Double {
val sortedActions = this.sortedActions
val firstIndexOfStreet = sortedActions.firstOrNull { it.street == street }?.index
?: sortedActions.size
return this.anteSum + sortedActions.take(firstIndexOfStreet).sumByDouble { it.effectiveAmount }
}
override fun localizedString(context: Context): CharSequence {
val positions = Position.positionsPerPlayers(this.numberOfPlayers)
var string = ""
// Settings
val players = "${this.numberOfPlayers} ${context.getString(R.string.players)}"
val firstLineComponents = mutableListOf(this.date.fullDate(), players)
this.smallBlind?.let { sb ->
this.bigBlind?.let { bb ->
firstLineComponents.add("$sb/$bb")
}
}
if (this.ante > 0.0) {
firstLineComponents.add("ante ${this.ante}")
}
string = string.plus(firstLineComponents.joinToString(" - "))
string = string.addLineReturn(2)
// Players
this.playerSetups.sortedBy { it.position }.forEach {
string = string.plus(localizedPlayerSetup(it, positions, context))
string = string.addLineReturn()
}
// Actions per street
val sortedActions = this.actions.sortedBy { it.index }
Street.values().forEach { street ->
string = string.addLineReturn(2)
val streetActions = sortedActions.filter { it.street == street }
if (streetActions.isNotEmpty()) {
val streetItems = mutableListOf<CharSequence>(context.getString(street.resId))
val potSize = this.potSizeForStreet(street)
if (potSize > 0) {
streetItems.add(context.getString(R.string.pot_size))
streetItems.add(potSize.formatted())
}
if (this.cards.isNotEmpty()) {
streetItems.add(this.cardsForStreet(street).formatted(context) ?: "")
}
string = string.plus(streetItems.joinToString(" "))
string = string.addLineReturn()
streetActions.forEach { action ->
string = string.plus(localizedAction(action, positions, context))
string = string.addLineReturn()
}
}
}
return string
}
private fun localizedPlayerSetup(playerSetup: PlayerSetup, positions: LinkedHashSet<Position>, context: Context): String {
val playerItems = mutableListOf(positions.elementAt(playerSetup.position).value)
playerItems.add("[${this.cards.formatted(context)}]")
playerSetup.stack?.let { stack ->
playerItems.add("- $stack")
}
return playerItems.joinToString(" ")
}
private fun localizedAction(action: Action, positions: LinkedHashSet<Position>, context: Context): String {
val actionItems = mutableListOf(positions.elementAt(action.position).value)
action.type?.let { type ->
actionItems.add(context.getString(type.resId))
}
action.amount?.let { amount ->
actionItems.add(amount.formatted())
}
return actionItems.joinToString(" ")
}
} }

@ -4,9 +4,9 @@ import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import net.pokeranalytics.android.model.realm.Player import net.pokeranalytics.android.model.realm.Player
import net.pokeranalytics.android.ui.modules.handhistory.model.CardHolder import net.pokeranalytics.android.ui.modules.handhistory.model.CardHolder
import net.pokeranalytics.android.ui.view.Localizable
open class PlayerSetup : RealmObject(), open class PlayerSetup : RealmObject(), CardHolder, Localizable {
CardHolder {
/*** /***
* The player * The player
@ -28,12 +28,4 @@ open class PlayerSetup : RealmObject(),
*/ */
override var cards: RealmList<Card> = RealmList() override var cards: RealmList<Card> = RealmList()
// fun cardValueSelected(value: Card.Value) {
//
// }
//
// fun cardSuitSelected(suit: Card.Suit) {
//
// }
} }

@ -1,6 +1,7 @@
package net.pokeranalytics.android.ui.modules.handhistory package net.pokeranalytics.android.ui.modules.handhistory
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.app.AlertDialog
import android.os.Bundle import android.os.Bundle
import android.view.* import android.view.*
import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.AccelerateDecelerateInterpolator
@ -29,6 +30,7 @@ import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.findById
import timber.log.Timber import timber.log.Timber
class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListener { class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListener {
/*** /***
@ -208,6 +210,7 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL
R.id.delete -> deleteHand() R.id.delete -> deleteHand()
R.id.back -> showPreviousHand() R.id.back -> showPreviousHand()
R.id.forward -> showNextHand() R.id.forward -> showNextHand()
R.id.export -> exportHand()
} }
return true return true
} }
@ -548,4 +551,40 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL
this.findNextActionToEdit(0) this.findNextActionToEdit(0)
} }
private fun exportHand() {
val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder.setTitle(R.string.export)
builder.setItems(arrayOf<CharSequence>(
getString(R.string.video),
"GIF",
getString(R.string.text)
)) { _, index ->
// The 'which' argument contains the index position
// of the selected item
when (index) {
0 -> this.videoExport()
1 -> this.gifExport()
2 -> this.textExport()
}
}
builder.create().show()
}
private fun videoExport() {
}
private fun gifExport() {
}
private fun textExport() {
val s = this.model.handHistory.localizedString(this.requireContext())
Timber.d("hand = $s")
}
} }

@ -95,4 +95,8 @@ interface Localizable {
return "LOCALISATION NOT FOUND" return "LOCALISATION NOT FOUND"
} }
fun localizedString(context: Context): CharSequence {
return ""
}
} }

@ -0,0 +1,5 @@
package net.pokeranalytics.android.util.extensions
fun String.addLineReturn(n: Int = 1): String {
return this.plus("\n".repeat(n))
}

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z"/>
</vector>

@ -7,6 +7,12 @@
android:title="@string/save" android:title="@string/save"
app:showAsAction="always" /> app:showAsAction="always" />
<item
android:id="@+id/export"
android:title="@string/export"
android:icon="@drawable/ic_get_app"
app:showAsAction="always" />
<item <item
android:id="@+id/add" android:id="@+id/add"
android:title="@string/add_a_hand_history" android:title="@string/add_a_hand_history"

@ -794,5 +794,7 @@
<string name="mississipi">mississipi</string> <string name="mississipi">mississipi</string>
<string name="add_vilain">Add vilain</string> <string name="add_vilain">Add vilain</string>
<string name="forward">Forward</string> <string name="forward">Forward</string>
<string name="video">Video</string>
<string name="text">Text</string>
</resources> </resources>

Loading…
Cancel
Save