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

feature/top10
Laurent 7 years ago
commit 448c0067a6
  1. 16
      app/src/main/java/net/pokeranalytics/android/model/Criteria.kt
  2. 8
      app/src/main/java/net/pokeranalytics/android/model/TableSize.kt
  3. 34
      app/src/main/java/net/pokeranalytics/android/model/comparison/Comparator.kt
  4. 210
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  5. 6
      app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt
  6. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt
  7. 27
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/LoaderDialogFragment.kt
  8. 19
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/PokerAnalyticsFragment.kt
  9. 10
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt
  10. 17
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt
  11. 50
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSectionRow.kt
  12. 34
      app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  13. 74
      app/src/main/res/drawable/ic_launcher_background.xml
  14. 16
      app/src/main/res/drawable/rectangle_rounded_dark.xml
  15. 21
      app/src/main/res/layout/fragment_loader.xml

@ -6,13 +6,14 @@ import io.realm.kotlin.where
import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import java.util.* import java.util.*
sealed class Criteria { sealed class Criteria {
abstract class RealmCriteria : Criteria() { abstract class RealmCriteria : Criteria() {
inline fun <reified T:Identifiable> comparison(): List<QueryCondition> { inline fun <reified T: NameManageable> comparison(): List<QueryCondition> {
return compare < QueryCondition.QueryDataCondition<Identifiable>, T >() return compare < QueryCondition.QueryDataCondition<NameManageable >, T >()
} }
} }
@ -48,8 +49,8 @@ sealed class Criteria {
object Limits: StaticCriteria() object Limits: StaticCriteria()
object TableSizes: StaticCriteria() object TableSizes: StaticCriteria()
object TournamentTypes: StaticCriteria() object TournamentTypes: StaticCriteria()
object monthOfYear: SimpleCriteria(List(12) { index -> QueryCondition.MONTH().apply { intValue = index } }) object monthOfYear: SimpleCriteria(List(12) { index -> QueryCondition.MONTH().apply { intValues = arrayListOf(index)} })
object dayOfWeek: SimpleCriteria(List(7) { index -> QueryCondition.DAY_OF_WEEK().apply { intValue = index } }) object dayOfWeek: SimpleCriteria(List(7) { index -> QueryCondition.DAY_OF_WEEK().apply { intValues = arrayListOf(index + 1) } })
object SessionType: SimpleCriteria(listOf(QueryCondition.CASH, QueryCondition.TOURNAMENT)) object SessionType: SimpleCriteria(listOf(QueryCondition.CASH, QueryCondition.TOURNAMENT))
object BankrollType: SimpleCriteria(listOf(QueryCondition.LIVE, QueryCondition.ONLINE)) object BankrollType: SimpleCriteria(listOf(QueryCondition.LIVE, QueryCondition.ONLINE))
object dayPeriod: SimpleCriteria(listOf(QueryCondition.WEEK_DAY, QueryCondition.WEEK_END)) object dayPeriod: SimpleCriteria(listOf(QueryCondition.WEEK_DAY, QueryCondition.WEEK_END))
@ -78,7 +79,7 @@ sealed class Criteria {
realm.where<Session>().sort("year", Sort.ASCENDING).findFirst()?.year?.let { realm.where<Session>().sort("year", Sort.ASCENDING).findFirst()?.year?.let {
for (index in 0..(yearNow - it)) { for (index in 0..(yearNow - it)) {
years.add(QueryCondition.YEAR().apply { years.add(QueryCondition.YEAR().apply {
intValue = yearNow - index intValues = arrayListOf(yearNow - index)
}) })
} }
} }
@ -88,7 +89,8 @@ sealed class Criteria {
is Blinds -> { is Blinds -> {
val blinds = arrayListOf<QueryCondition.BLIND>() val blinds = arrayListOf<QueryCondition.BLIND>()
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
realm.where<Session>().distinct("blinds", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map { val query = realm.where<Session>().distinct("blinds").findAll().sort("cgSmallBlind", Sort.ASCENDING)
query.map {
it.blinds?.let { stake -> it.blinds?.let { stake ->
blinds.add(QueryCondition.BLIND().apply { blinds.add(QueryCondition.BLIND().apply {
blind = stake blind = stake
@ -104,7 +106,7 @@ sealed class Criteria {
} }
companion object { companion object {
inline fun < reified S : QueryCondition.QueryDataCondition<Identifiable>, reified T : Identifiable > compare(): List<S> { inline fun < reified S : QueryCondition.QueryDataCondition<NameManageable >, reified T : NameManageable > compare(): List<S> {
val objects = arrayListOf<S>() val objects = arrayListOf<S>()
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
realm.where<T>().findAll().forEach { realm.where<T>().findAll().forEach {

@ -14,6 +14,14 @@ class TableSize(var numberOfPlayer: Int, var rowViewType: Int = RowViewType.TITL
} }
} }
override fun getDisplayName(): String {
return if (this.numberOfPlayer == 2) {
return "HU"
} else {
"${this.numberOfPlayer}-max"
}
}
override val resId: Int? override val resId: Int?
get() { get() {
return if (this.numberOfPlayer == 2) { return if (this.numberOfPlayer == 2) {

@ -47,39 +47,15 @@ enum class Comparator {
realm.close() realm.close()
fees fees
} }
MONTH_OF_YEAR -> List(12) { index -> QueryCondition.MONTH().apply { intValue = index } } MONTH_OF_YEAR -> Criteria.monthOfYear.queryConditions
DAY_OF_WEEK -> List(7) { index -> QueryCondition.DAY_OF_WEEK().apply { intValue = index } } DAY_OF_WEEK -> Criteria.dayOfWeek.queryConditions
YEAR -> { YEAR -> Criteria.Year.queryConditions
val years = arrayListOf<QueryCondition.YEAR>() DAY_PERIOD -> Criteria.dayPeriod.queryConditions
val calendar = Calendar.getInstance()
calendar.time = Date()
val yearNow = calendar.get(Calendar.YEAR)
val realm = Realm.getDefaultInstance()
realm.where<Session>().sort("year", Sort.ASCENDING).findFirst()?.year?.let {
for (index in 0..(yearNow - it)) {
years.add(QueryCondition.YEAR().apply { intValue = yearNow - index })
}
}
realm.close()
years
}
DAY_PERIOD -> listOf(QueryCondition.WEEK_DAY, QueryCondition.WEEK_END)
CASH -> listOf(QueryCondition.CASH) CASH -> listOf(QueryCondition.CASH)
TOURNAMENT -> listOf(QueryCondition.TOURNAMENT) TOURNAMENT -> listOf(QueryCondition.TOURNAMENT)
LIVE -> listOf(QueryCondition.LIVE) LIVE -> listOf(QueryCondition.LIVE)
ONLINE -> listOf(QueryCondition.ONLINE) ONLINE -> listOf(QueryCondition.ONLINE)
BLIND -> { BLIND -> Criteria.Blinds.queryConditions
val blinds = arrayListOf<QueryCondition.BLIND>()
val realm = Realm.getDefaultInstance()
realm.where<Session>().distinct("blinds", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map {
it.blinds?.let { stake ->
blinds.add(QueryCondition.BLIND().apply { blind = stake
hasDefaultCurrency = it.hasDefaultCurrency })
}
}
realm.close()
blinds
}
BANKROLL -> Criteria.Bankrolls.queryConditions BANKROLL -> Criteria.Bankrolls.queryConditions
GAME -> Criteria.Games.queryConditions GAME -> Criteria.Games.queryConditions
TOURNAMENT_NAME-> Criteria.TournamentNames.queryConditions TOURNAMENT_NAME-> Criteria.TournamentNames.queryConditions

@ -5,16 +5,20 @@ import io.realm.*
import io.realm.kotlin.where import io.realm.kotlin.where
import io.realm.RealmQuery import io.realm.RealmQuery
import io.realm.internal.Table import io.realm.internal.Table
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TableSize
import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow
import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.extensions.endOfDay import net.pokeranalytics.android.util.extensions.endOfDay
import net.pokeranalytics.android.util.extensions.startOfDay import net.pokeranalytics.android.util.extensions.startOfDay
import java.text.DateFormatSymbols import java.text.DateFormatSymbols
@ -22,7 +26,7 @@ import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
fun List<QueryCondition>.name() : String { fun List<QueryCondition>.name() : String {
return this.map { it.label() }.joinToString(" / ") return this.map { it.getDisplayName() }.joinToString(" / ")
} }
//inline fun <reified T : Filterable> List<QueryCondition>.query(realm: Realm): RealmQuery<T> { //inline fun <reified T : Filterable> List<QueryCondition>.query(realm: Realm): RealmQuery<T> {
@ -44,11 +48,38 @@ inline fun <reified T : Filterable> List<QueryCondition>.queryWith(query: RealmQ
* A new type should also set the expected numericValues required in the [filterValuesExpectedKeys] * A new type should also set the expected numericValues required in the [filterValuesExpectedKeys]
*/ */
interface Labelable { sealed class QueryCondition : FilterElementRow {
fun label() : String
} companion object {
fun valueOf(name:String) : QueryCondition {
val kClass = Class.forName("${QueryCondition::class.qualifiedName}$$name").kotlin
val instance = kClass.objectInstance ?: kClass.java.newInstance()
return instance as QueryCondition
}
inline fun <reified T:Identifiable>getInstance(): QueryCondition {
return when (T::class.java) {
Bankroll::class.java -> BANKROLL()
Game::class.java -> GAME()
Location::class.java -> LOCATION()
TournamentName::class.java -> TOURNAMENT_NAME()
TournamentFeature::class.java -> ANY_TOURNAMENT_FEATURES()
else -> throw PokerAnalyticsException.QueryTypeUnhandled
}
}
inline fun < reified T: Filterable, reified S: QueryCondition>distinct(): RealmResults<T>? {
FilterHelper.fieldNameForQueryType<T>(S::class.java)?.let {
val realm = Realm.getDefaultInstance()
val distincts = realm.where<T>().distinct(it).findAll().sort(it, Sort.ASCENDING)
realm.close()
return distincts
}
return null
}
sealed class QueryCondition : FilterElementRow, Labelable {
}
interface Valuable <T : ArrayList<T>> { interface Valuable <T : ArrayList<T>> {
var values: ArrayList<T>? var values: ArrayList<T>?
@ -112,127 +143,108 @@ sealed class QueryCondition : FilterElementRow, Labelable {
} }
} }
override fun label(): String { override fun getDisplayName(): String {
return when (this) { return when (this) {
is YEAR -> "$intValue" is StaticDataQueryCondition -> label()
is MONTH -> DateFormatSymbols.getInstance(Locale.getDefault()).months[intValue] is QueryDataCondition<*> -> label()
is BLIND -> this.blind!!
else -> baseId else -> baseId
} }
} }
override var filterSectionRow: FilterSectionRow = FilterSectionRow.CASH_TOURNAMENT override var filterSectionRow: FilterSectionRow = FilterSectionRow.CASH_TOURNAMENT
open class OperationQueryCondition : QueryCondition(), asDoubleValue { abstract class QueryDataCondition < T: NameManageable > : QueryCondition(), asListOfString {
override var doubleValues = ArrayList<Double>()
}
open class BetweenQueryCondition : QueryCondition(), asListOfDouble {
override var doubleValues = ArrayList<Double>()
}
abstract class QueryDataCondition < T: Identifiable> : QueryCondition(), asListOfString {
fun setObject(dataObject: T) { fun setObject(dataObject: T) {
this.dataObject = dataObject this.dataObject = dataObject
this.stringValues.add(dataObject.id) this.stringValues.add(dataObject.id)
} }
var dataObject: Identifiable? = null
var dataObject: NameManageable? = null
override var stringValues = ArrayList<String>() override var stringValues = ArrayList<String>()
val name: String abstract val entity : Class<T>
get() {
if (stringValues.size > 1) { fun label(): String {
return "multiple" val realm = Realm.getDefaultInstance()
} else { val completeLabel = when (stringValues.size) {
return (dataObject as RowRepresentable).getDisplayName() 0 -> return NULL_TEXT
1,2 -> {
return stringValues.map { labelForValue(realm, it) }.joinToString(", ")
} }
return "todo" else -> "${stringValues.size} $baseId"
} }
realm.close()
return completeLabel
} }
companion object { fun labelForValue(realm:Realm, value:String): String {
fun valueOf(name:String) : QueryCondition { val query = realm.where(entity)
val kClass = Class.forName("${QueryCondition::class.qualifiedName}$$name").kotlin return query.equalTo("id", value).findFirst()?.name ?: NULL_TEXT
val instance = kClass.objectInstance ?: kClass.java.newInstance()
return instance as QueryCondition
}
inline fun <reified T:Identifiable>getInstance(): QueryCondition {
return when (T::class.java) {
Bankroll::class.java -> BANKROLL()
Game::class.java -> GAME()
Location::class.java -> LOCATION()
TournamentName::class.java -> TOURNAMENT_NAME()
TournamentFeature::class.java -> ANY_TOURNAMENT_FEATURES()
else -> throw PokerAnalyticsException.QueryTypeUnhandled
} }
} }
inline fun < reified T: Filterable, reified S: QueryCondition>distinct(): RealmResults<T>? { abstract class SingleValueQueryCondition : QueryCondition(), asIntValue {
FilterHelper.fieldNameForQueryType<T>(S::class.java)?.let { override var doubleValues = ArrayList<Double>()
val realm = Realm.getDefaultInstance()
val distincts = realm.where<T>().distinct(it).findAll().sort(it, Sort.ASCENDING)
realm.close()
return distincts
}
return null
} }
abstract class StaticDataQueryCondition : QueryCondition(), asListOfInt {
var data : RowRepresentable? = null
override var doubleValues = ArrayList<Double>()
abstract fun labelForValue(value:Int): String
fun label(): String {
return when (intValues.size) {
0 -> return NULL_TEXT
1,2 -> intValues.map { labelForValue(it) }.joinToString(", ")
else -> "${intValues.size} $baseId"
}
}
} }
//open val name: String = this::class.simpleName ?: throw PokerAnalyticsException.FilterElementUnknownName open class OperationQueryCondition : QueryCondition(), asDoubleValue {
abstract class SingleValueQueryCondition : QueryCondition(), asIntValue {
override var doubleValues = ArrayList<Double>() override var doubleValues = ArrayList<Double>()
} }
abstract class StaticDataQueryCondition : QueryCondition(), asListOfInt { open class BetweenQueryCondition : QueryCondition(), asListOfDouble {
var data : RowRepresentable? = null
override var doubleValues = ArrayList<Double>() override var doubleValues = ArrayList<Double>()
} }
open class DateQuery: QueryCondition(), asDateValue {
override var dateValue: Date = Date()
override val showTime: Boolean = false
}
open class TimeQuery: DateQuery() {
override val showTime: Boolean = true
}
object LIVE : QueryCondition() object LIVE : QueryCondition()
object CASH : QueryCondition() object CASH : QueryCondition()
object ONLINE : QueryCondition() object ONLINE : QueryCondition()
object TOURNAMENT: QueryCondition() object TOURNAMENT: QueryCondition()
class BANKROLL: QueryDataCondition<Bankroll>() class BANKROLL: QueryDataCondition<Bankroll>() { override val entity: Class<Bankroll> = Bankroll::class.java }
class GAME: QueryDataCondition<Game>() class GAME: QueryDataCondition<Game>() { override val entity: Class<Game> = Game::class.java }
class TOURNAMENT_NAME: QueryDataCondition<TournamentName>() class TOURNAMENT_NAME: QueryDataCondition<TournamentName>() { override val entity: Class<TournamentName> = TournamentName::class.java }
class ANY_TOURNAMENT_FEATURES: QueryDataCondition<TournamentFeature>() class ANY_TOURNAMENT_FEATURES: QueryDataCondition<TournamentFeature>() { override val entity: Class<TournamentFeature> = TournamentFeature::class.java }
class ALL_TOURNAMENT_FEATURES: QueryDataCondition<TournamentFeature>() class ALL_TOURNAMENT_FEATURES: QueryDataCondition<TournamentFeature>() { override val entity: Class<TournamentFeature> = TournamentFeature::class.java }
class LOCATION: QueryDataCondition<Location>() class LOCATION: QueryDataCondition<Location>() { override val entity: Class<Location> = Location::class.java }
class LIMIT: StaticDataQueryCondition() { class LIMIT: StaticDataQueryCondition() {
val limit : Limit get() { return Limit.values()[intValues.first()] } override fun labelForValue(value: Int): String {
val name: String return Limit.values()[value].getDisplayName()
get() {
if (intValues.size > 1) {
return "multiple"
} else if (intValues.size > 0) {
return Limit.values()[intValues.first()].longName
}
return "todo"
} }
} }
class TABLE_SIZE: StaticDataQueryCondition() { class TABLE_SIZE: StaticDataQueryCondition() {
val tableSize: TableSize get() { return TableSize.all[intValues.first()] } override fun labelForValue(value: Int): String {
return TableSize(value).getDisplayName()
override fun localizedTitle(context: Context): String {
return this.tableSize.localizedTitle(context)
} }
} }
class TOURNAMENT_TYPE: StaticDataQueryCondition() { class TOURNAMENT_TYPE: StaticDataQueryCondition() {
val name: String override fun labelForValue(value: Int): String {
get() { return TournamentType.values()[value].getDisplayName()
if (intValues.size > 1) {
return "multiple"
} else {
return TournamentType.values()[intValues.first()].getDisplayName()
}
return "todo"
} }
} }
@ -274,26 +286,32 @@ sealed class QueryCondition : FilterElementRow, Labelable {
doubleValues.add(rightValue) doubleValues.add(rightValue)
} }
} }
class MIN_RE_BUY: OperationQueryCondition(), More class MIN_RE_BUY: OperationQueryCondition(), More, Amount
class MAX_RE_BUY: OperationQueryCondition(), Less class MAX_RE_BUY: OperationQueryCondition(), Less, Amount
// Dates
open class DateQuery: QueryCondition(), asDateValue {
override var dateValue: Date = Date()
override val showTime: Boolean = false
}
open class TimeQuery: DateQuery() {
override val showTime: Boolean = true
}
class STARTED_FROM_DATE: DateQuery() class STARTED_FROM_DATE: DateQuery()
class STARTED_TO_DATE: DateQuery(), Less class STARTED_TO_DATE: DateQuery(), Less
class ENDED_FROM_DATE: DateQuery() class ENDED_FROM_DATE: DateQuery()
class ENDED_TO_DATE: DateQuery(), Less class ENDED_TO_DATE: DateQuery(), Less
class DAY_OF_WEEK: SingleValueQueryCondition()
class MONTH: SingleValueQueryCondition() class DAY_OF_WEEK: StaticDataQueryCondition() {
class YEAR: SingleValueQueryCondition() override fun labelForValue(value: Int): String {
return DateFormatSymbols.getInstance(Locale.getDefault()).weekdays[value]
}
}
class MONTH: StaticDataQueryCondition() {
override fun labelForValue(value: Int): String {
return DateFormatSymbols.getInstance(Locale.getDefault()).months[value]
}
}
class YEAR: StaticDataQueryCondition() {
override fun labelForValue(value: Int): String {
return "$value"
}
}
object WEEK_DAY: QueryCondition() object WEEK_DAY: QueryCondition()
object WEEK_END: QueryCondition() object WEEK_END: QueryCondition()
object TODAY: QueryCondition() object TODAY: QueryCondition()

@ -256,8 +256,8 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
// Set date data // Set date data
conditions.forEach { condition -> conditions.forEach { condition ->
when (condition) { when (condition) {
is QueryCondition.YEAR -> calendar.set(Calendar.YEAR, condition.intValue) is QueryCondition.YEAR -> calendar.set(Calendar.YEAR, condition.intValues.first())
is QueryCondition.MONTH -> calendar.set(Calendar.MONTH, condition.intValue) is QueryCondition.MONTH -> calendar.set(Calendar.MONTH, condition.intValues.first())
} }
} }
@ -282,7 +282,7 @@ class CalendarFragment : SessionObserverFragment(), CoroutineScope, StaticRowRep
// Set date data // Set date data
conditions.forEach { condition -> conditions.forEach { condition ->
when (condition) { when (condition) {
is QueryCondition.YEAR -> calendar.set(Calendar.YEAR, condition.intValue) is QueryCondition.YEAR -> calendar.set(Calendar.YEAR, condition.intValues.first())
} }
} }
yearlyReports[calendar.time] = computedResults yearlyReports[calendar.time] = computedResults

@ -105,8 +105,7 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
*/ */
private fun launchComputation(comparators: List<Comparator>, reportName: String) { private fun launchComputation(comparators: List<Comparator>, reportName: String) {
//val loader = LoaderDialogFragment.newInstance() showLoader()
//loader.show(activity?.supportFragmentManager, "loader")
GlobalScope.launch { GlobalScope.launch {
@ -121,6 +120,7 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
if (!isDetached) { if (!isDetached) {
hideLoader()
ReportDetailsActivity.newInstance(requireContext(), report, reportName) ReportDetailsActivity.newInstance(requireContext(), report, reportName)
} }
} }

@ -5,24 +5,49 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import kotlinx.android.synthetic.main.fragment_loader.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
class LoaderDialogFragment: DialogFragment() { class LoaderDialogFragment: DialogFragment() {
companion object { companion object {
const val ARGUMENT_MESSAGE_RES_ID = "ARGUMENT_MESSAGE_RES_ID"
/** /**
* Create new instance * Create new instance
*/ */
fun newInstance(): LoaderDialogFragment { fun newInstance(resId: Int? = null, isCancelable: Boolean = false): LoaderDialogFragment {
val fragment = LoaderDialogFragment() val fragment = LoaderDialogFragment()
fragment.isCancelable = isCancelable
val bundle = Bundle() val bundle = Bundle()
resId?.let {
bundle.putInt(ARGUMENT_MESSAGE_RES_ID, resId)
}
fragment.arguments = bundle fragment.arguments = bundle
return fragment return fragment
} }
} }
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_loader, container, false) return inflater.inflate(R.layout.fragment_loader, container, false)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments?.let {bundle ->
if (bundle.containsKey(ARGUMENT_MESSAGE_RES_ID)) {
loadingMessage.text = getString(bundle.getInt(ARGUMENT_MESSAGE_RES_ID))
}
}
}
override fun onStart() {
super.onStart()
val window = dialog.window
window?.setBackgroundDrawableResource(android.R.color.transparent)
}
} }

@ -7,6 +7,7 @@ import io.realm.Realm
open class PokerAnalyticsFragment: Fragment() { open class PokerAnalyticsFragment: Fragment() {
private var realm: Realm? = null private var realm: Realm? = null
private var loaderDialogFragment: LoaderDialogFragment? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -36,4 +37,22 @@ open class PokerAnalyticsFragment: Fragment() {
*/ */
open fun onBackPressed(){} open fun onBackPressed(){}
/**
* Show the loader
*/
fun showLoader(resId: Int? = null, cancelable: Boolean? = false) {
loaderDialogFragment = LoaderDialogFragment.newInstance(resId, false)
activity?.let {
loaderDialogFragment?.show(it.supportFragmentManager, "loader")
}
}
/**
* Hide the loader
*/
fun hideLoader() {
loaderDialogFragment?.dismiss()
loaderDialogFragment = null
}
} }

@ -33,7 +33,8 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In
GENERAL -> arrayListOf( GENERAL -> arrayListOf(
CASH_TOURNAMENT, CASH_TOURNAMENT,
LIVE_ONLINE, LIVE_ONLINE,
GAME, LIMIT_TYPE, GAME,
LIMIT_TYPE,
TABLE_SIZE TABLE_SIZE
) )
DATE -> arrayListOf( DATE -> arrayListOf(
@ -59,11 +60,8 @@ enum class FilterCategoryRow(override val resId: Int?, override val viewType: In
) )
TOURNAMENT -> arrayListOf( TOURNAMENT -> arrayListOf(
TOURNAMENT_TYPE, TOURNAMENT_TYPE,
COMPLETION_PERCENTAGE, TOURNAMENT_NAME,
PLACE, TOURNAMENT_FEATURE
PLAYERS_COUNT,
TOURNAMENT_RE_BUY_COUNT,
BUY_IN
) )
ONLINE -> arrayListOf( ONLINE -> arrayListOf(
MULTI_TABLING MULTI_TABLING

@ -98,23 +98,6 @@ interface FilterElementRow : RowRepresentable {
} }
} }
override fun getDisplayName(): String {
return when (this) {
is QueryCondition.SingleValueQueryCondition -> {
when (this) {
is QueryCondition.DAY_OF_WEEK -> DateFormatSymbols.getInstance(Locale.getDefault()).weekdays[this.intValue]
is QueryCondition.MONTH -> DateFormatSymbols.getInstance(Locale.getDefault()).months[this.intValue]
else -> "${this.intValue}"
}
}
is QueryCondition.QueryDataCondition<*> -> this.name
is QueryCondition.LIMIT -> this.name
is QueryCondition.TOURNAMENT_TYPE -> this.name
is QueryCondition.BLIND -> this.blind!!
else -> super.getDisplayName()
}
}
var filterSectionRow: FilterSectionRow var filterSectionRow: FilterSectionRow
val sectionToExclude: List<FilterSectionRow>? val sectionToExclude: List<FilterSectionRow>?

@ -85,38 +85,9 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
FIXED_DATE -> arrayListOf(QueryCondition.STARTED_FROM_DATE(), QueryCondition.ENDED_TO_DATE()) FIXED_DATE -> arrayListOf(QueryCondition.STARTED_FROM_DATE(), QueryCondition.ENDED_TO_DATE())
DURATION -> arrayListOf(QueryCondition.PAST_DAYS()) DURATION -> arrayListOf(QueryCondition.PAST_DAYS())
WEEKDAYS_OR_WEEKEND -> arrayListOf(QueryCondition.WEEK_DAY, QueryCondition.WEEK_END) WEEKDAYS_OR_WEEKEND -> arrayListOf(QueryCondition.WEEK_DAY, QueryCondition.WEEK_END)
/* YEAR -> Criteria.Year.queryConditions
YEAR -> { DAY_OF_WEEK -> Criteria.dayOfWeek.queryConditions
val years = arrayListOf<FilterElementRow.Year>() MONTH_OF_YEAR -> Criteria.monthOfYear.queryConditions
val realm = Realm.getDefaultInstance()
val distinctYears =
realm.where<Session>().distinct("year").findAll().sort("year", Sort.DESCENDING)
distinctYears.forEach { session ->
session.year?.let { year ->
years.add(Year(year))
}
}
realm.close()
years
}
DAY_OF_WEEK -> {
val daysOfWeek = arrayListOf<FilterElementRow.Day>()
DateFormatSymbols.getInstance(Locale.getDefault()).weekdays.forEachIndexed { index, day ->
if (day.isNotEmpty()) {
daysOfWeek.add(Day(index))
}
}
daysOfWeek
}
MONTH_OF_YEAR -> {
val months = arrayListOf<FilterElementRow.Month>()
DateFormatSymbols.getInstance(Locale.getDefault()).months.forEachIndexed { index, month ->
if (month.isNotEmpty()) {
months.add(Month(index))
}
}
months
}*/
// Duration // Duration
SESSION_DURATION -> arrayListOf(QueryCondition.MORE_THAN_DURATION(), QueryCondition.LESS_THAN_DURATION() as QueryCondition) SESSION_DURATION -> arrayListOf(QueryCondition.MORE_THAN_DURATION(), QueryCondition.LESS_THAN_DURATION() as QueryCondition)
@ -133,21 +104,10 @@ enum class FilterSectionRow(override val resId: Int?) : RowRepresentable {
SESSIONS -> arrayListOf(QueryCondition.LAST_GAMES(), QueryCondition.LAST_SESSIONS()) SESSIONS -> arrayListOf(QueryCondition.LAST_GAMES(), QueryCondition.LAST_SESSIONS())
// Cash // Cash
/* BLIND -> Criteria.Blinds.queryConditions
BLIND -> {
val blinds = arrayListOf<Blind>()
val realm = Realm.getDefaultInstance()
realm.where<Session>().distinct("blind", "bankroll.currency.code").findAll().sort("cgSmallBlind", Sort.ASCENDING).map {
it.blinds?.let { stake ->
blinds.add(Blind(stake, it.hasDefaultCurrency))
}
}
realm.close()
blinds
}*/
CASH_RE_BUY_COUNT -> arrayListOf( CASH_RE_BUY_COUNT -> arrayListOf(
QueryCondition.MAX_RE_BUY(), QueryCondition.MAX_RE_BUY(),
QueryCondition.MIN_RE_BUY() QueryCondition.MIN_RE_BUY() as QueryCondition
) )
// Tournament // Tournament

@ -1,34 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0"/>
<item
android:color="#00000000"
android:offset="1.0"/>
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1"/>
</vector>

@ -1,74 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:height="108dp"
android:width="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path android:fillColor="#008577"
android:pathData="M0,0h108v108h-108z"/>
<path android:fillColor="#00000000" android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
</vector>

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="@color/colorPrimary"/>
<corners
android:radius="2dp" />
<size
android:width="32dp"
android:height="32dp"/>
</shape>

@ -2,10 +2,20 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="256dp" android:layout_width="wrap_content"
android:layout_height="128dp" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:background="@color/colorPrimary"> android:background="@android:color/transparent"
android:elevation="4dp">
<View
android:layout_width="256dp"
android:layout_height="120dp"
android:background="@drawable/rectangle_rounded_dark"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.core.widget.ContentLoadingProgressBar <androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/progressBar" android:id="@+id/progressBar"
@ -26,15 +36,14 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginTop="16dp" android:layout_marginTop="8dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:fontFamily="@font/roboto" android:fontFamily="@font/roboto"
android:textSize="16sp"
android:text="@string/calculating_please_wait_" android:text="@string/calculating_please_wait_"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/progressBar" app:layout_constraintTop_toBottomOf="@+id/progressBar"
app:layout_constraintVertical_chainStyle="packed" /> app:layout_constraintVertical_chainStyle="packed" />

Loading…
Cancel
Save