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

feature/top10
Razmig Sarkissian 7 years ago
commit 7feec6f693
  1. 7
      app/build.gradle
  2. 3
      app/src/main/AndroidManifest.xml
  3. 36
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  4. 18
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt
  6. 17
      app/src/main/java/net/pokeranalytics/android/util/Extensions.kt
  7. 91
      app/src/main/res/layout/fragment_session.xml
  8. 6
      app/src/main/res/layout/row_session_view.xml
  9. 2
      app/src/main/res/values/styles.xml

@ -34,6 +34,10 @@ android {
} }
} }
configurations {
all*.exclude group: 'com.google.guava', module: 'listenablefuture'
}
} }
dependencies { dependencies {
@ -47,6 +51,9 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
// Places
implementation 'com.google.android.libraries.places:places:1.0.0'
// Firebase // Firebase
implementation 'com.google.firebase:firebase-core:16.0.7' implementation 'com.google.firebase:firebase-core:16.0.7'

@ -2,6 +2,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.pokeranalytics.android"> package="net.pokeranalytics.android">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application <application
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"

@ -1,5 +1,6 @@
package net.pokeranalytics.android.model.realm package net.pokeranalytics.android.model.realm
import android.content.Context
import android.text.InputType import android.text.InputType
import io.realm.* import io.realm.*
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
@ -16,6 +17,7 @@ import net.pokeranalytics.android.ui.view.RowEditable
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SessionRow import net.pokeranalytics.android.ui.view.SessionRow
import net.pokeranalytics.android.util.data.sessionDao import net.pokeranalytics.android.util.data.sessionDao
import net.pokeranalytics.android.util.getDuration
import net.pokeranalytics.android.util.short import net.pokeranalytics.android.util.short
import net.pokeranalytics.android.util.toCurrency import net.pokeranalytics.android.util.toCurrency
import java.util.* import java.util.*
@ -138,6 +140,15 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
} }
} }
/**
* Return the duration of the current session
*/
fun getDuration(context: Context): String {
val startDate = timeFrame?.startDate ?: Date()
val enDate = timeFrame?.endDate ?: Date()
return startDate.getDuration(context, enDate)
}
/** /**
* Delete the object from realm * Delete the object from realm
* TODO: Cascade delete? * TODO: Cascade delete?
@ -270,7 +281,6 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
override val primaryKey: String get() = this.id override val primaryKey: String get() = this.id
override fun getBottomSheetData(row: RowRepresentable): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: RowRepresentable): ArrayList<BottomSheetData> {
val data = ArrayList<BottomSheetData>() val data = ArrayList<BottomSheetData>()
@ -282,8 +292,18 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
data.add(BottomSheetData(100.0 * (cgBigBlind ?: 0.0))) data.add(BottomSheetData(100.0 * (cgBigBlind ?: 0.0)))
data.add(BottomSheetData(200.0 * (cgBigBlind ?: 0.0))) data.add(BottomSheetData(200.0 * (cgBigBlind ?: 0.0)))
data.add(BottomSheetData(buyin)) data.add(BottomSheetData(buyin))
data.add(BottomSheetData("",inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL)) data.add(
data.add(BottomSheetData("",inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL)) BottomSheetData(
"",
inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
)
)
data.add(
BottomSheetData(
"",
inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
)
)
} }
SessionRow.TIPS -> { SessionRow.TIPS -> {
// Disable the buttons with value = 0, add current value & set the 2 edit texts // Disable the buttons with value = 0, add current value & set the 2 edit texts
@ -294,7 +314,9 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
data.add(BottomSheetData("", inputType = InputType.TYPE_CLASS_NUMBER)) data.add(BottomSheetData("", inputType = InputType.TYPE_CLASS_NUMBER))
data.add(BottomSheetData("", inputType = InputType.TYPE_CLASS_NUMBER)) data.add(BottomSheetData("", inputType = InputType.TYPE_CLASS_NUMBER))
} }
SessionRow.TABLE_SIZE -> {data.add(BottomSheetData(tableSize))} SessionRow.TABLE_SIZE -> {
data.add(BottomSheetData(tableSize))
}
SessionRow.GAME -> { SessionRow.GAME -> {
// Add current game & games list // Add current game & games list
data.add(BottomSheetData(limit)) data.add(BottomSheetData(limit))
@ -351,14 +373,16 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource
if (value == null) { if (value == null) {
timeFrame = null timeFrame = null
} else { } else {
val timeFrameToUpdate = if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java) val timeFrameToUpdate =
if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java)
timeFrameToUpdate.setDate(value, null) timeFrameToUpdate.setDate(value, null)
timeFrame = timeFrameToUpdate timeFrame = timeFrameToUpdate
} }
} }
//TODO: Update //TODO: Update
SessionRow.END_DATE -> if (value is Date?) { SessionRow.END_DATE -> if (value is Date?) {
val timeFrameToUpdate = if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java) val timeFrameToUpdate =
if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java)
timeFrameToUpdate.setDate(null, value) timeFrameToUpdate.setDate(null, value)
timeFrame = timeFrameToUpdate timeFrame = timeFrameToUpdate
} }

@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.* import android.view.*
import android.view.animation.OvershootInterpolator import android.view.animation.OvershootInterpolator
import android.widget.Toast import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import io.realm.kotlin.where import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_session.* import kotlinx.android.synthetic.main.fragment_session.*
@ -23,6 +24,7 @@ import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheet
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SessionRow import net.pokeranalytics.android.ui.view.SessionRow
import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
import net.pokeranalytics.android.util.px
import net.pokeranalytics.android.util.toast import net.pokeranalytics.android.util.toast
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
@ -156,6 +158,10 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
when (currentSession.getState()) { when (currentSession.getState()) {
SessionState.PENDING -> { SessionState.PENDING -> {
state.text = "WAITING"
state.setTextColor(ContextCompat.getColor(requireContext(), R.color.white))
sessionData.animate().translationY(-(72f.px)).alpha(0f).setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
recyclerView.animate().translationY(-(72f.px)).setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
sessionMenu?.findItem(R.id.restart)?.isVisible = false sessionMenu?.findItem(R.id.restart)?.isVisible = false
floatingActionButton.setImageResource(R.drawable.ic_outline_play) floatingActionButton.setImageResource(R.drawable.ic_outline_play)
bottomAppBar.menu.findItem(R.id.stop).isVisible = false bottomAppBar.menu.findItem(R.id.stop).isVisible = false
@ -163,6 +169,10 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
.setInterpolator(OvershootInterpolator()).start() .setInterpolator(OvershootInterpolator()).start()
} }
SessionState.STARTED -> { SessionState.STARTED -> {
state.text = "PLAYING"
state.setTextColor(ContextCompat.getColor(requireContext(), R.color.green))
sessionData.animate().translationY(0f).alpha(1f).setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
recyclerView.animate().translationY(0f.px).setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
sessionMenu?.findItem(R.id.restart)?.isVisible = true sessionMenu?.findItem(R.id.restart)?.isVisible = true
floatingActionButton.setImageResource(R.drawable.ic_outline_pause) floatingActionButton.setImageResource(R.drawable.ic_outline_pause)
bottomAppBar.menu.findItem(R.id.stop).isVisible = true bottomAppBar.menu.findItem(R.id.stop).isVisible = true
@ -170,6 +180,10 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
.setInterpolator(OvershootInterpolator()).start() .setInterpolator(OvershootInterpolator()).start()
} }
SessionState.PAUSED -> { SessionState.PAUSED -> {
state.text = "BREAK"
state.setTextColor(ContextCompat.getColor(requireContext(), R.color.blue))
sessionData.animate().translationY(0f).alpha(1f).setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
recyclerView.animate().translationY(0f.px).setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
sessionMenu?.findItem(R.id.restart)?.isVisible = true sessionMenu?.findItem(R.id.restart)?.isVisible = true
floatingActionButton.setImageResource(R.drawable.ic_outline_play) floatingActionButton.setImageResource(R.drawable.ic_outline_play)
bottomAppBar.menu.findItem(R.id.stop).isVisible = true bottomAppBar.menu.findItem(R.id.stop).isVisible = true
@ -177,6 +191,10 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
.setInterpolator(OvershootInterpolator()).start() .setInterpolator(OvershootInterpolator()).start()
} }
SessionState.FINISHED -> { SessionState.FINISHED -> {
state.text = "FINISHED"
state.setTextColor(ContextCompat.getColor(requireContext(), R.color.white))
sessionData.animate().translationY(0f).alpha(1f).setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
recyclerView.animate().translationY(0f.px).setInterpolator(FastOutSlowInInterpolator()).setDuration(500).start()
sessionMenu?.findItem(R.id.restart)?.isVisible = true sessionMenu?.findItem(R.id.restart)?.isVisible = true
bottomAppBar.menu.findItem(R.id.stop).isVisible = false bottomAppBar.menu.findItem(R.id.stop).isVisible = false
floatingActionButton.animate().scaleX(0f).scaleY(0f).alpha(0f) floatingActionButton.animate().scaleX(0f).scaleY(0f).alpha(0f)

@ -64,7 +64,7 @@ class SessionRowView : FrameLayout {
rowHistorySession.gameType.text = gameTitle rowHistorySession.gameType.text = gameTitle
rowHistorySession.gameInfo.text = "Game info: duration, table size, ..." rowHistorySession.gameInfo.text = session.getDuration(context)
rowHistorySession.gameResult.text = "$ 0" rowHistorySession.gameResult.text = "$ 0"
} }

@ -1,5 +1,6 @@
package net.pokeranalytics.android.util package net.pokeranalytics.android.util
import android.content.Context
import android.content.res.Resources import android.content.res.Resources
import android.widget.Toast import android.widget.Toast
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
@ -9,6 +10,8 @@ import java.text.DecimalFormat
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
// Sizes // Sizes
val Int.dp: Int val Int.dp: Int
get() = (this / Resources.getSystem().displayMetrics.density).toInt() get() = (this / Resources.getSystem().displayMetrics.density).toInt()
@ -55,6 +58,20 @@ fun Date.getDayNumber() : String {
fun Date.getShortDayName() : String { fun Date.getShortDayName() : String {
return SimpleDateFormat("EE", Locale.getDefault()).format(this) return SimpleDateFormat("EE", Locale.getDefault()).format(this)
} }
// Return the duration between two dates
fun Date.getDuration(context: Context, toDate: Date) : String {
val difference = (toDate.time - this.time).toInt()
val numOfDays = (difference / (1000 * 60 * 60 * 24))
val hours = (difference / (1000 * 60 * 60))
val minutes = (difference / (1000 * 60)) % 60
val seconds = (difference / 1000) % 60
val hoursStr = if (hours < 10) "0$hours" else "$hours"
val minutesStr = if (minutes < 10) "0$minutes" else "$minutes"
val secondsStr = if (seconds < 10) "0$seconds" else "$seconds"
return "$hoursStr:$minutesStr:$secondsStr"
}
// Toast // Toast

@ -15,16 +15,98 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/sessionData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/gray_darker"
android:elevation="4dp"
android:translationY="-72dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:translationY="0dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/sinceTitle"
style="@style/PokerAnalyticsTheme.TextView.RowTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginBottom="16dp"
android:text="Since"
android:textAllCaps="true"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/sinceValue"
style="@style/PokerAnalyticsTheme.TextView.RowTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginBottom="16dp"
android:text="2h33"
android:textSize="24sp"
app:fontFamily="@font/roboto_bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/sinceTitle" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/resultTitle"
style="@style/PokerAnalyticsTheme.TextView.RowTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="Result"
android:textAllCaps="true"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/PokerAnalyticsTheme.TextView.RowTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="$ 325"
android:textColor="@color/green"
android:textSize="28sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/resultTitle" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/state"
style="@style/PokerAnalyticsTheme.TextView.RowTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PLAYING"
android:textColor="@color/colorAccent"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<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:paddingBottom="96dp"
android:clipToPadding="false" android:clipToPadding="false"
android:paddingBottom="96dp"
android:translationY="-72dp"
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_toTopOf="parent" /> app:layout_constraintTop_toBottomOf="@+id/sessionData"
tools:translationY="0dp" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
@ -55,6 +137,7 @@
app:titleTextColor="@color/white" app:titleTextColor="@color/white"
tools:title="Poker Analytics" /> tools:title="Poker Analytics" />
</com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
@ -63,10 +146,10 @@
android:id="@+id/bottomAppBar" android:id="@+id/bottomAppBar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:fabAlignmentMode="center" android:layout_gravity="bottom"
android:background="@color/red" android:background="@color/red"
android:theme="@style/PokerAnalyticsTheme.BottomAppBar" android:theme="@style/PokerAnalyticsTheme.BottomAppBar"
android:layout_gravity="bottom" /> app:fabAlignmentMode="center" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton" android:id="@+id/floatingActionButton"

@ -9,9 +9,10 @@
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/dateDay" android:id="@+id/dateDay"
style="@style/PokerAnalyticsTheme.TextView.SessionRow.Date" style="@style/PokerAnalyticsTheme.TextView.SessionRow.Date"
android:layout_width="wrap_content" android:layout_width="32dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:gravity="center"
android:textAllCaps="true" android:textAllCaps="true"
app:layout_constraintBottom_toTopOf="@+id/dateNumber" app:layout_constraintBottom_toTopOf="@+id/dateNumber"
app:layout_constraintStart_toStartOf="@+id/guidelineStart" app:layout_constraintStart_toStartOf="@+id/guidelineStart"
@ -22,9 +23,10 @@
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/dateNumber" android:id="@+id/dateNumber"
style="@style/PokerAnalyticsTheme.TextView.SessionRow.DateNumber" style="@style/PokerAnalyticsTheme.TextView.SessionRow.DateNumber"
android:layout_width="wrap_content" android:layout_width="32dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/dateDay" app:layout_constraintEnd_toEndOf="@+id/dateDay"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"

@ -136,7 +136,6 @@
<!-- Alert Dialog --> <!-- Alert Dialog -->
<style name="PokerAnalyticsTheme.AlertDialog" parent="Theme.MaterialComponents.Dialog"> <style name="PokerAnalyticsTheme.AlertDialog" parent="Theme.MaterialComponents.Dialog">
<item name="colorAccent">@color/green</item> <item name="colorAccent">@color/green</item>
<item name="android:textColorPrimary">@color/white</item> <item name="android:textColorPrimary">@color/white</item>
@ -145,7 +144,6 @@
<!-- EditText --> <!-- EditText -->
<style name="PokerAnalyticsTheme.EditText" parent="Widget.AppCompat.EditText"> <style name="PokerAnalyticsTheme.EditText" parent="Widget.AppCompat.EditText">
<item name="android:textColor">@color/white</item> <item name="android:textColor">@color/white</item>
<item name="android:fontFamily">@font/roboto</item> <item name="android:fontFamily">@font/roboto</item>

Loading…
Cancel
Save