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

feature/top10
Razmig Sarkissian 7 years ago
commit d5f941b7c1
  1. 50
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  2. 2
      app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt
  3. 3
      app/src/main/java/net/pokeranalytics/android/model/Limit.kt
  4. 3
      app/src/main/java/net/pokeranalytics/android/model/TableSize.kt
  5. 10
      app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
  6. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
  7. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt
  8. 14
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  9. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
  10. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  11. 59
      app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt
  12. 21
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  13. 12
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  14. 6
      app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt
  15. 52
      app/src/main/java/net/pokeranalytics/android/util/Extensions.kt
  16. 46
      app/src/main/res/layout/fragment_history.xml
  17. 3
      app/src/main/res/layout/fragment_session.xml
  18. 20
      app/src/main/res/layout/row_history_session.xml
  19. 2
      app/src/main/res/layout/row_session_view.xml
  20. 19
      app/src/main/res/values/styles.xml

@ -5,8 +5,11 @@ import io.realm.Realm
import io.realm.RealmConfiguration import io.realm.RealmConfiguration
import io.realm.RealmResults import io.realm.RealmResults
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.realm.Game import net.pokeranalytics.android.model.realm.Game
import net.pokeranalytics.android.model.realm.Result
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.TimeFrame
import net.pokeranalytics.android.util.PokerAnalyticsLogs import net.pokeranalytics.android.util.PokerAnalyticsLogs
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
@ -86,6 +89,53 @@ class PokerAnalyticsApplication : Application() {
} }
} }
if (BuildConfig.DEBUG) {
val sessions = realm.where<Session>().findAll()
if (sessions.size < 10) {
for (index in 0..50) {
realm.executeTransaction {
val session = Session()
session.id = UUID.randomUUID().toString()
val calendar = Calendar.getInstance()
calendar.set(
(2017..2018).random(),
(0..11).random(),
(0..28).random(),
(0..23).random(),
(0..59).random()
)
val startDate = calendar.time
calendar.add(Calendar.HOUR_OF_DAY, (2..12).random())
calendar.add(Calendar.MINUTE, (0..59).random())
val endDate = calendar.time
val timeFrame = TimeFrame()
timeFrame.setDate(startDate, endDate)
session.timeFrame = timeFrame
session.creationDate = startDate
session.limit = Limit.values().random().ordinal
session.game = realm.where<Game>().findAll().random()
val result = Result()
result.buyin = arrayListOf(100, 200, 300, 500, 1000, 2000).random().toDouble()
result.netResult = arrayListOf(
-2500.0, -2000.0, -1500.0, -1000.0, -500.0, 200.0, 1000.0, 1500.0,
2500.0
).random()
session.result = result
realm.copyToRealmOrUpdate(session)
}
}
}
}
realm.close()
} }
} }

@ -73,6 +73,8 @@ enum class Stat : RowRepresentable {
} }
override val viewType: Int = RowViewType.TITLE_VALUE.ordinal override val viewType: Int = RowViewType.TITLE_VALUE.ordinal
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }
/** /**

@ -36,6 +36,9 @@ enum class Limit : RowRepresentable {
override fun getDisplayName(): String { override fun getDisplayName(): String {
return this.longName return this.longName
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }
/* /*

@ -33,4 +33,7 @@ class TableSize(var numberOfPlayer: Int) : RowRepresentable {
override val viewType: Int override val viewType: Int
get() = RowViewType.TITLE_GRID.ordinal get() = RowViewType.TITLE_GRID.ordinal
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -3,11 +3,14 @@ package net.pokeranalytics.android.model.realm
import android.text.InputType import android.text.InputType
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.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.view.BankrollRow
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.* import net.pokeranalytics.android.ui.view.SimpleRow
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -92,4 +95,9 @@ open class Bankroll(name: String = "") : RealmObject(), Savable,
override fun isValidForSave(): Boolean { override fun isValidForSave(): Boolean {
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import android.text.InputType import android.text.InputType
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
@ -75,4 +76,9 @@ open class Game : RealmObject(), Savable, RowRepresentableDataSource,
override fun isValidForSave(): Boolean { override fun isValidForSave(): Boolean {
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import android.text.InputType import android.text.InputType
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
@ -71,4 +72,9 @@ open class Location : RealmObject(), Savable, RowRepresentableDataSource, RowRep
override fun isValidForSave(): Boolean { override fun isValidForSave(): Boolean {
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -14,12 +14,12 @@ import net.pokeranalytics.android.model.extensions.SessionState
import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.SessionRow import net.pokeranalytics.android.ui.view.SessionRow
import net.pokeranalytics.android.util.getDuration import net.pokeranalytics.android.util.getDuration
import net.pokeranalytics.android.util.round import net.pokeranalytics.android.util.round
import net.pokeranalytics.android.util.short import net.pokeranalytics.android.util.shortDateTime
import net.pokeranalytics.android.util.toCurrency import net.pokeranalytics.android.util.toCurrency
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
@ -95,6 +95,12 @@ open class Session : RealmObject(), SessionInterface, Savable,
// The features of the tournament, like Knockout, Shootout, Turbo... // The features of the tournament, like Knockout, Shootout, Turbo...
var tournamentFeatures: RealmList<TournamentFeature> = RealmList() var tournamentFeatures: RealmList<TournamentFeature> = RealmList()
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
/** /**
* Start a session * Start a session
*/ */
@ -283,8 +289,8 @@ open class Session : RealmObject(), SessionInterface, Savable,
SessionRow.LOCATION -> location?.name ?: "--" SessionRow.LOCATION -> location?.name ?: "--"
SessionRow.BANKROLL -> bankroll?.name ?: "--" SessionRow.BANKROLL -> bankroll?.name ?: "--"
SessionRow.TABLE_SIZE -> tableSize?.toString() ?: "--" SessionRow.TABLE_SIZE -> tableSize?.toString() ?: "--"
SessionRow.START_DATE -> if (timeFrame != null) timeFrame?.startDate?.short() ?: "--" else "--" SessionRow.START_DATE -> if (timeFrame != null) timeFrame?.startDate?.shortDateTime() ?: "--" else "--"
SessionRow.END_DATE -> if (timeFrame != null) timeFrame?.endDate?.short() ?: "--" else "--" SessionRow.END_DATE -> if (timeFrame != null) timeFrame?.endDate?.shortDateTime() ?: "--" else "--"
SessionRow.COMMENT -> if (comment.isNotEmpty()) comment else "--" SessionRow.COMMENT -> if (comment.isNotEmpty()) comment else "--"
else -> "--" else -> "--"
} }

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import android.text.InputType import android.text.InputType
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
@ -65,4 +66,9 @@ open class TournamentFeature : RealmObject(), Savable, RowRepresentableDataSourc
override fun isValidForSave(): Boolean { override fun isValidForSave(): Boolean {
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import android.text.InputType import android.text.InputType
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
@ -71,6 +72,11 @@ open class TransactionType : RealmObject(), Savable, RowRepresentableDataSource,
override fun isValidForSave(): Boolean { override fun isValidForSave(): Boolean {
return this.name.isNotEmpty() return this.name.isNotEmpty()
} }
@Ignore
override var displayHeader: Boolean = false
@Ignore
override var headerValues: ArrayList<String> = ArrayList()
} }
enum class TransactionKind { enum class TransactionKind {

@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.RealmResults import io.realm.RealmResults
import io.realm.Sort import io.realm.Sort
@ -20,6 +19,11 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.getMonthAndYear
import net.pokeranalytics.android.util.isSameDay
import net.pokeranalytics.android.util.isSameMonth
import net.pokeranalytics.android.util.longDate
import java.util.*
class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource,
RowRepresentableDelegate { RowRepresentableDelegate {
@ -35,6 +39,7 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource,
private lateinit var historyAdapter: RowRepresentableAdapter private lateinit var historyAdapter: RowRepresentableAdapter
private lateinit var realmSessions: RealmResults<Session> private lateinit var realmSessions: RealmResults<Session>
private val sessions: ArrayList<Session> = ArrayList()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_history, container, false) return inflater.inflate(R.layout.fragment_history, container, false)
@ -54,6 +59,10 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource,
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
historyAdapter.notifyDataSetChanged() historyAdapter.notifyDataSetChanged()
sessions.clear()
sessions.addAll(getRealm().copyFromRealm(realmSessions))
createSessionsHeaders()
} }
/** /**
@ -61,7 +70,7 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource,
*/ */
private fun initUI() { private fun initUI() {
newSession.setOnClickListener { newCashGame.setOnClickListener {
SessionActivity.newInstance(requireContext(), false) SessionActivity.newInstance(requireContext(), false)
} }
@ -69,13 +78,6 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource,
SessionActivity.newInstance(requireContext(), true) SessionActivity.newInstance(requireContext(), true)
} }
newHand.setOnClickListener {
Toast.makeText(requireContext(), "Open new hand", Toast.LENGTH_SHORT).show()
}
newTransaction.setOnClickListener {
Toast.makeText(requireContext(), "Open new transaction", Toast.LENGTH_SHORT).show()
}
} }
/** /**
@ -83,9 +85,12 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource,
*/ */
private fun initData() { private fun initData() {
realmSessions = getRealm().where<Session>().findAll().sort("timeFrame.startDate", Sort.DESCENDING) realmSessions = getRealm().where<Session>().findAll().sort("timeFrame.startDate", Sort.DESCENDING)
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
historyAdapter = RowRepresentableAdapter(this, this) historyAdapter = RowRepresentableAdapter(this, this)
createSessionsHeaders()
recyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager layoutManager = viewManager
@ -93,12 +98,42 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource,
} }
} }
/**
* Create the sessions headers
*/
private fun createSessionsHeaders() {
val groupedByDay = false
val calendar = Calendar.getInstance()
val currentCalendar = Calendar.getInstance()
for ((index, session) in sessions.withIndex()) {
currentCalendar.time = session.creationDate
if (groupedByDay) {
if (!calendar.isSameDay(currentCalendar) || index == 0) {
calendar.time = currentCalendar.time
session.displayHeader = true
session.headerValues = arrayListOf(session.creationDate.longDate(), "$ 123")
}
} else {
if (!calendar.isSameMonth(currentCalendar) || index == 0) {
calendar.time = currentCalendar.time
session.displayHeader = true
session.headerValues = arrayListOf(session.creationDate.getMonthAndYear(), "$ 123")
}
}
}
}
override fun rowRepresentableForPosition(position: Int): RowRepresentable { override fun rowRepresentableForPosition(position: Int): RowRepresentable {
return this.realmSessions[position] as RowRepresentable return this.sessions[position]
} }
override fun numberOfRows(): Int { override fun numberOfRows(): Int {
return this.realmSessions.size return this.sessions.size
} }
override fun viewTypeForPosition(position: Int): Int { override fun viewTypeForPosition(position: Int): Int {
@ -106,7 +141,7 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource,
} }
override fun indexForRow(row: RowRepresentable): Int { override fun indexForRow(row: RowRepresentable): Int {
return this.realmSessions.indexOf(row) return this.sessions.indexOf(row)
} }
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {

@ -69,6 +69,10 @@ interface Displayable: Localizable {
get() { get() {
return false return false
} }
var displayHeader: Boolean
var headerValues: ArrayList<String>
} }
enum class SessionRow : RowRepresentable { enum class SessionRow : RowRepresentable {
@ -179,6 +183,9 @@ enum class SessionRow : RowRepresentable {
else -> BottomSheetType.NONE else -> BottomSheetType.NONE
} }
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }
enum class SimpleRow : RowRepresentable { enum class SimpleRow : RowRepresentable {
@ -187,6 +194,8 @@ enum class SimpleRow : RowRepresentable {
override val resId: Int? = R.string.name override val resId: Int? = R.string.name
override val viewType: Int = RowViewType.TITLE_VALUE.ordinal override val viewType: Int = RowViewType.TITLE_VALUE.ordinal
override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }
enum class BankrollRow : RowRepresentable { enum class BankrollRow : RowRepresentable {
@ -212,6 +221,9 @@ enum class BankrollRow : RowRepresentable {
LIVE -> BottomSheetType.NONE LIVE -> BottomSheetType.NONE
} }
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }
enum class GameRow : RowRepresentable { enum class GameRow : RowRepresentable {
@ -237,6 +249,9 @@ enum class GameRow : RowRepresentable {
SHORT_NAME -> BottomSheetType.EDIT_TEXT SHORT_NAME -> BottomSheetType.EDIT_TEXT
} }
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }
enum class LocationRow : RowRepresentable { enum class LocationRow : RowRepresentable {
@ -262,6 +277,9 @@ enum class LocationRow : RowRepresentable {
LOCATION_STATUS -> BottomSheetType.NONE LOCATION_STATUS -> BottomSheetType.NONE
} }
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }
enum class TransactionTypeRow : RowRepresentable { enum class TransactionTypeRow : RowRepresentable {
@ -303,4 +321,7 @@ enum class SettingRow : RowRepresentable {
else -> null else -> null
} }
} }
override var displayHeader: Boolean = false
override var headerValues: ArrayList<String> = ArrayList()
} }

@ -3,6 +3,7 @@ package net.pokeranalytics.android.ui.view
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.row_bottom_sheet_grid_title.view.* import kotlinx.android.synthetic.main.row_bottom_sheet_grid_title.view.*
import kotlinx.android.synthetic.main.row_bottom_sheet_title.view.* import kotlinx.android.synthetic.main.row_bottom_sheet_title.view.*
@ -50,13 +51,24 @@ enum class RowViewType {
inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder { BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
if (row.displayHeader) {
itemView.sessionHeader.isVisible = true
itemView.sessionHeader.text = row.headerValues.firstOrNull() ?: ""
} else {
itemView.sessionHeader.isVisible = false
}
itemView.sessionRow.setData(row as Session) itemView.sessionRow.setData(row as Session)
val listener = View.OnClickListener { val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row) adapter.delegate?.onRowSelected(position, row)
} }
itemView.sessionRow.setOnClickListener(listener) itemView.sessionRow.setOnClickListener(listener)
} }
} }
inner class CellSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { inner class CellSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {

@ -5,12 +5,14 @@ import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.row_session_view.view.* import kotlinx.android.synthetic.main.row_session_view.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.util.getDayNumber import net.pokeranalytics.android.util.getDayNumber
import net.pokeranalytics.android.util.getShortDayName import net.pokeranalytics.android.util.getShortDayName
import net.pokeranalytics.android.util.toCurrency import net.pokeranalytics.android.util.toCurrency
import timber.log.Timber
class SessionRowView : FrameLayout { class SessionRowView : FrameLayout {
@ -60,6 +62,10 @@ class SessionRowView : FrameLayout {
rowHistorySession.gameInfo.text = session.getDuration(context) rowHistorySession.gameInfo.text = session.getDuration(context)
rowHistorySession.gameResult.text = session.result?.netResult?.toCurrency() ?: "$0" rowHistorySession.gameResult.text = session.result?.netResult?.toCurrency() ?: "$0"
val result = session.result?.netResult ?: 0.0
val resultColor = if (result >= 0.0) R.color.green else R.color.red
rowHistorySession.gameResult.setTextColor(ContextCompat.getColor(context, resultColor))
} }
} }

@ -35,19 +35,54 @@ fun Double.toCurrency(): String {
return "$ ${formatter.format(this)}" return "$ ${formatter.format(this)}"
} }
// Calendar
// Return if the calendar dates are in the same month
fun Calendar.isSameMonth(calendar: Calendar): Boolean {
return calendar.get(Calendar.YEAR) == this.get(Calendar.YEAR) &&
calendar.get(Calendar.MONTH) == this.get(Calendar.MONTH)
}
// Return if the calendar dates are in the same day
fun Calendar.isSameDay(calendar: Calendar): Boolean {
return calendar.get(Calendar.YEAR) == this.get(Calendar.YEAR) &&
calendar.get(Calendar.MONTH) == this.get(Calendar.MONTH) &&
calendar.get(Calendar.DAY_OF_MONTH) == this.get(Calendar.DAY_OF_MONTH)
}
// Date // Date
// Return a short string of the date // Return a short string of the date
fun Date.short(): String { fun Date.shortDate(): String {
return DateFormat.getDateInstance(DateFormat.SHORT).format(this)
}
// Return a short string of the date
fun Date.mediumDate(): String {
return DateFormat.getDateInstance(DateFormat.MEDIUM).format(this)
}
// Return a long string of the date
fun Date.longDate(): String {
return DateFormat.getDateInstance(DateFormat.LONG).format(this)
}
// Return a short string of the date
fun Date.fullDate(): String {
return DateFormat.getDateInstance(DateFormat.FULL).format(this)
}
// Return a short string of the date & time
fun Date.shortDateTime(): String {
return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(this) return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(this)
} }
// Return a medium string of the date // Return a medium string of the date & time
fun Date.medium(): String { fun Date.mediumDateTime(): String {
return DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(this) return DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(this)
} }
// Return the full string of the date // Return a long string of the date & time
fun Date.full(): String { fun Date.longDateTime(): String {
return DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(this)
}
// Return the full string of the date & time
fun Date.fullDateTime(): String {
return DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(this) return DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(this)
} }
// Return the day number of the date // Return the day number of the date
@ -56,8 +91,13 @@ fun Date.getDayNumber() : String {
} }
// Return the 3 first letters of the date's day // Return the 3 first letters of the date's day
fun Date.getShortDayName() : String { fun Date.getShortDayName() : String {
return SimpleDateFormat("EE", Locale.getDefault()).format(this) return SimpleDateFormat("EE", Locale.getDefault()).format(this).substring(0, 3)
}
// Return the month & year of the date
fun Date.getMonthAndYear(): String {
return SimpleDateFormat("MMMM YYYY", Locale.getDefault()).format(this).capitalize()
} }
// Return the duration between two dates // Return the duration between two dates
fun Date.getDuration(context: Context, toDate: Date) : String { fun Date.getDuration(context: Context, toDate: Date) : String {
val difference = (toDate.time - this.time).toInt() val difference = (toDate.time - this.time).toInt()

@ -7,6 +7,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.activity.HomeActivity"> tools:context=".ui.activity.HomeActivity">
<!--
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/newSession" android:id="@+id/newSession"
android:layout_width="48dp" android:layout_width="48dp"
@ -17,6 +18,7 @@
android:elevation="4dp" android:elevation="4dp"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/add_cash_game" android:src="@drawable/add_cash_game"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/newTournament" app:layout_constraintEnd_toStartOf="@+id/newTournament"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -31,6 +33,7 @@
android:elevation="4dp" android:elevation="4dp"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/add_tournoi" android:src="@drawable/add_tournoi"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/newHand" app:layout_constraintEnd_toStartOf="@+id/newHand"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/newSession" app:layout_constraintStart_toEndOf="@+id/newSession"
@ -45,6 +48,7 @@
android:elevation="4dp" android:elevation="4dp"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/add_hand" android:src="@drawable/add_hand"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/newTransaction" app:layout_constraintEnd_toStartOf="@+id/newTransaction"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/newTournament" app:layout_constraintStart_toEndOf="@+id/newTournament"
@ -60,20 +64,58 @@
android:elevation="4dp" android:elevation="4dp"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/add_transaction" android:src="@drawable/add_transaction"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/newHand" app:layout_constraintStart_toEndOf="@+id/newHand"
app:layout_constraintTop_toTopOf="@+id/newSession" /> app:layout_constraintTop_toTopOf="@+id/newSession" />
-->
<com.google.android.material.button.MaterialButton
android:id="@+id/newCashGame"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="@string/new_cash_game"
app:icon="@drawable/add_cash_game"
app:iconSize="32dp"
app:layout_constraintEnd_toStartOf="@+id/newTournament"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/newTournament"
style="@style/PokerAnalyticsTheme.Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:text="@string/new_tournament"
app:icon="@drawable/add_tournoi"
app:iconSize="32dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/newCashGame"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginTop="16dp" android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/newHand" app:layout_constraintTop_toBottomOf="@+id/newCashGame"
tools:listitem="@layout/row_history_session" /> tools:listitem="@layout/row_history_session" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

@ -159,6 +159,7 @@
android:layout_gravity="bottom|center" android:layout_gravity="bottom|center"
android:layout_marginBottom="28dp" android:layout_marginBottom="28dp"
android:elevation="16dp" android:elevation="16dp"
android:src="@drawable/ic_outline_play" /> android:src="@drawable/ic_outline_play"
android:tint="@color/black" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

@ -1,12 +1,24 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/sessionHeader"
style="@style/PokerAnalyticsTheme.TextView.SessionHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:visibility="gone"
tools:text="Header"
tools:visibility="visible" />
<net.pokeranalytics.android.ui.view.SessionRowView <net.pokeranalytics.android.ui.view.SessionRowView
android:id="@+id/sessionRow" android:id="@+id/sessionRow"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
</FrameLayout> </LinearLayout>

@ -40,7 +40,7 @@
style="@style/PokerAnalyticsTheme.TextView.SessionRow.Title" style="@style/PokerAnalyticsTheme.TextView.SessionRow.Title"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginStart="8dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
app:layout_constraintBottom_toTopOf="@+id/gameInfo" app:layout_constraintBottom_toTopOf="@+id/gameInfo"

@ -101,6 +101,14 @@
</style> </style>
<!-- Session Row --> <!-- Session Row -->
<style name="PokerAnalyticsTheme.TextView.SessionHeader">
<item name="android:textColor">@color/kaki_medium</item>
<item name="android:maxLines">1</item>
<item name="android:ellipsize">end</item>
<item name="android:fontFamily">@font/roboto_bold</item>
<item name="android:textSize">16sp</item>
</style>
<style name="PokerAnalyticsTheme.TextView.SessionRow"> <style name="PokerAnalyticsTheme.TextView.SessionRow">
<item name="android:textColor">@color/white</item> <item name="android:textColor">@color/white</item>
<item name="android:maxLines">1</item> <item name="android:maxLines">1</item>
@ -154,6 +162,17 @@
</style> </style>
<!-- Button --> <!-- Button -->
<style name="PokerAnalyticsTheme.Button" parent="Widget.MaterialComponents.Button">
<item name="iconPadding">0dp</item>
<item name="iconTint">@color/black</item>
<item name="android:letterSpacing">-0.02</item>
<item name="android:fontFamily">@font/roboto_medium</item>
<item name="android:textColor">@color/black</item>
<item name="android:paddingStart">4dp</item>
<item name="android:paddingEnd">8dp</item>
<item name="android:textSize">12sp</item>
</style>
<style name="PokerAnalyticsTheme.Button.Borderless" parent="Widget.MaterialComponents.Button"> <style name="PokerAnalyticsTheme.Button.Borderless" parent="Widget.MaterialComponents.Button">
<item name="android:background">?selectableItemBackgroundBorderless</item> <item name="android:background">?selectableItemBackgroundBorderless</item>
<item name="android:textColor">@color/green</item> <item name="android:textColor">@color/green</item>

Loading…
Cancel
Save