Compare commits

...

16 Commits
master ... dev

Author SHA1 Message Date
Laurent b1fce6a99d Merge branch 'dev' of gitlab.com:stax-river/poker-analytics into dev 6 years ago
Razmig Sarkissian 7abf6fd268 delete unused LocaleUtils 6 years ago
Razmig Sarkissian 7474b33a7e renaming exception 6 years ago
Razmig Sarkissian 7653ea86ce Merge branch 'master' into dev 6 years ago
Razmig Sarkissian c025f35d43 rename bottomsheetFragment to inputFragment for clarity 6 years ago
Razmig Sarkissian e8f83ba08b clean up bottom sheet and datetimepicker management 6 years ago
Razmig Sarkissian 8835a7d4d6 fix crash when creating a new transaction 6 years ago
Razmig Sarkissian 5882fd8cd6 WIP refactoring editDescriptor 6 years ago
Razmig Sarkissian 63d6c9b5b9 wip refactoring editDescriptor 6 years ago
Razmig Sarkissian 20494c7849 Merge branch 'master' into dev 6 years ago
Razmig Sarkissian 5689b8dfe4 wip refactoring editDescriptor 6 years ago
Razmig Sarkissian a2e9b8309c Merge branch 'master' into dev 6 years ago
Razmig Sarkissian ac2000ea8c Merge branch 'master' into dev 6 years ago
Razmig Sarkissian 86a2f3bb1b Merge branch 'master' into dev 6 years ago
Razmig Sarkissian fa5e098b31 fix issue with current week filter 6 years ago
Razmig Sarkissian fcb69f5711 fix issue with realm migration 7 years ago
  1. 2
      app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt
  2. 14
      app/src/main/java/net/pokeranalytics/android/model/filter/QueryCondition.kt
  3. 12
      app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
  4. 65
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  5. 25
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt
  6. 27
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  7. 18
      app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
  8. 111
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  9. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/TimeFrame.kt
  10. 14
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
  11. 13
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt
  12. 11
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  13. 2
      app/src/main/java/net/pokeranalytics/android/model/utils/SessionSetManager.kt
  14. 9
      app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt
  15. 15
      app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt
  16. 32
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt
  17. 12
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersListFragment.kt
  18. 29
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  19. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt
  20. 50
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetType.kt
  21. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputDoubleEditTextFragment.kt
  22. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputEditTextFragment.kt
  23. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputEditTextMultiLinesFragment.kt
  24. 69
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputFragment.kt
  25. 50
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputFragmentType.kt
  26. 17
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputListFragment.kt
  27. 17
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputListGameFragment.kt
  28. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputMultiSelectionFragment.kt
  29. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputNumericTextFragment.kt
  30. 17
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputStaticListFragment.kt
  31. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputSumFragment.kt
  32. 8
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/input/InputTableSizeGridFragment.kt
  33. 20
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt
  34. 14
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt
  35. 3
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt
  36. 15
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt
  37. 40
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt
  38. 5
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt
  39. 69
      app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt
  40. 93
      app/src/main/java/net/pokeranalytics/android/ui/view/RowEditableDescriptor.kt
  41. 23
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  42. 14
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentableEditDescriptor.kt
  43. 67
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt
  44. 57
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt
  45. 44
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterElementRow.kt
  46. 31
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt
  47. 34
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt
  48. 545
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt
  49. 7
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt
  50. 47
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TournamentFeatureRow.kt
  51. 47
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TournamentNameRow.kt
  52. 99
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionRow.kt
  53. 32
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionTypeRow.kt
  54. 36
      app/src/main/java/net/pokeranalytics/android/util/LocaleUtils.kt
  55. 2
      app/src/main/java/net/pokeranalytics/android/util/LocationManager.kt

@ -21,6 +21,8 @@ sealed class PokerAnalyticsException(message: String) : Exception(message) {
object QueryTypeUnhandled: PokerAnalyticsException(message = "queryWith type not handled") object QueryTypeUnhandled: PokerAnalyticsException(message = "queryWith type not handled")
object QueryValueMapUnexpectedValue: PokerAnalyticsException(message = "valueMap null not expected") object QueryValueMapUnexpectedValue: PokerAnalyticsException(message = "valueMap null not expected")
object FilterElementExpectedValueMissing : PokerAnalyticsException(message = "queryWith is empty or null") object FilterElementExpectedValueMissing : PokerAnalyticsException(message = "queryWith is empty or null")
object InputFragmentException : PokerAnalyticsException(message = "RowEditableDelegate must be a Fragment")
object DateTimePickerException: PokerAnalyticsException(message = "DataSource is not a DateRowEditableDescriptor")
data class FilterElementTypeMissing(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "queryWith element '$filterElementRow' type is missing") data class FilterElementTypeMissing(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "queryWith element '$filterElementRow' type is missing")
data class QueryValueMapMissingKeys(val missingKeys: List<String>) : PokerAnalyticsException(message = "valueMap does not contain $missingKeys") data class QueryValueMapMissingKeys(val missingKeys: List<String>) : PokerAnalyticsException(message = "valueMap does not contain $missingKeys")
data class UnknownQueryTypeForRow(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "no queryWith type for $filterElementRow") data class UnknownQueryTypeForRow(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "no queryWith type for $filterElementRow")

@ -15,7 +15,7 @@ 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.NameManageable import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterElementRow
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSectionRow
@ -593,7 +593,7 @@ sealed class QueryCondition : FilterElementRow {
} }
override val viewType: Int = RowViewType.TITLE_VALUE_CHECK.ordinal override val viewType: Int = RowViewType.TITLE_VALUE_CHECK.ordinal
override val bottomSheetType: BottomSheetType = BottomSheetType.DOUBLE_EDIT_TEXT override val inputFragmentType: InputFragmentType = InputFragmentType.DOUBLE_EDIT_TEXT
override fun labelForValue(value: Int, context: Context): String { override fun labelForValue(value: Int, context: Context): String {
return value.toMinutes(context) return value.toMinutes(context)
@ -952,15 +952,15 @@ sealed class QueryCondition : FilterElementRow {
} }
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return when (this) { return when (this) {
is PastDay -> BottomSheetType.EDIT_TEXT is PastDay -> InputFragmentType.EDIT_TEXT
else -> { else -> {
when (this.operator) { when (this.operator) {
Operator.MORE -> BottomSheetType.EDIT_TEXT Operator.MORE -> InputFragmentType.EDIT_TEXT
Operator.LESS -> BottomSheetType.EDIT_TEXT Operator.LESS -> InputFragmentType.EDIT_TEXT
else -> BottomSheetType.NONE else -> InputFragmentType.NONE
} }
} }
} }

@ -15,7 +15,6 @@ import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollRow import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollRow
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.UserDefaults
import java.util.* import java.util.*
@ -46,13 +45,22 @@ open class Bankroll : RealmObject(), NameManageable, RowRepresentable {
return this.currency?.rate ?: Currency.DEFAULT_RATE return this.currency?.rate ?: Currency.DEFAULT_RATE
} }
val javaCurrency: java.util.Currency
get() {
return currency?.code?.let {
java.util.Currency.getInstance(it)
} ?: run {
UserDefaults.currency
}
}
override fun getDisplayName(context: Context): String { override fun getDisplayName(context: Context): String {
return this.name return this.name
} }
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" BankrollRow.NAME -> this.name = value as String? ?: ""
BankrollRow.LIVE -> { BankrollRow.LIVE -> {
this.live = if (value is Boolean) !value else false this.live = if (value is Boolean) !value else false
} }

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import android.content.Context import android.content.Context
import android.text.InputType import android.text.InputType
import androidx.fragment.app.Fragment
import io.realm.Realm import io.realm.Realm
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
@ -14,14 +15,15 @@ import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus
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.interfaces.NameManageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
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.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.util.enumerations.IntIdentifiable import net.pokeranalytics.android.util.enumerations.IntIdentifiable
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -125,9 +127,23 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
return rowRepresentation return rowRepresentation
} }
override fun startEditing(dataSource: Any?, parent: Fragment?) {
if (dataSource == null) return
if (dataSource !is Session) return
if (parent == null) return
if (parent !is RowRepresentableDelegate) return
val data = RowEditableDataSource()
when (type) {
Type.LIST.uniqueIdentifier -> data.append(dataSource.customFieldEntries.find { it.customField?.id == id }?.value, staticData = entries)
else -> data.append(dataSource.customFieldEntries.find { it.customField?.id == dataSource.id }?.numericValue, inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL or InputType.TYPE_NUMBER_FLAG_SIGNED)
}
InputFragment.buildAndShow(this, parent, data)
}
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" CustomFieldRow.NAME -> this.name = value as String? ?: ""
CustomFieldRow.TYPE -> this.type = (value as Type?)?.uniqueIdentifier ?: Type.LIST.uniqueIdentifier CustomFieldRow.TYPE -> this.type = (value as Type?)?.uniqueIdentifier ?: Type.LIST.uniqueIdentifier
CustomFieldRow.COPY_ON_DUPLICATE -> this.duplicateValue = value as Boolean? ?: false CustomFieldRow.COPY_ON_DUPLICATE -> this.duplicateValue = value as Boolean? ?: false
} }
@ -161,11 +177,11 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
return R.string.cf_entry_delete_popup_message return R.string.cf_entry_delete_popup_message
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return when (type) { return when (type) {
Type.LIST.uniqueIdentifier -> BottomSheetType.LIST_STATIC Type.LIST.uniqueIdentifier -> InputFragmentType.LIST_STATIC
else -> BottomSheetType.NUMERIC_TEXT else -> InputFragmentType.NUMERIC_TEXT
} }
} }
@ -176,45 +192,12 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return when (row) {
is CustomFieldEntry -> row.editingDescriptors(
mapOf(
"defaultValue" to row.value
)
)
else -> null
}
}
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? {
return when (type) {
Type.LIST.uniqueIdentifier -> {
val defaultValue: Any? by map
val data: RealmList<CustomFieldEntry>? by map
arrayListOf(
RowRepresentableEditDescriptor(defaultValue, staticData = data)
)
}
else -> {
val defaultValue: Double? by map
arrayListOf(
RowRepresentableEditDescriptor(
defaultValue, inputType = InputType.TYPE_CLASS_NUMBER
or InputType.TYPE_NUMBER_FLAG_DECIMAL
or InputType.TYPE_NUMBER_FLAG_SIGNED
)
)
}
}
}
/** /**
* Update the row representation * Update the row representation
*/ */
private fun updatedRowRepresentationForCurrentState(): List<RowRepresentable> { private fun updatedRowRepresentationForCurrentState(): List<RowRepresentable> {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(CustomFieldRow.NAME)
rows.add(CustomFieldRow.TYPE) rows.add(CustomFieldRow.TYPE)
if (type == Type.LIST.uniqueIdentifier && entries.size >= 0) { if (type == Type.LIST.uniqueIdentifier && entries.size >= 0) {

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import android.content.Context import android.content.Context
import android.text.InputType import android.text.InputType
import androidx.fragment.app.Fragment
import io.realm.Realm import io.realm.Realm
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.RealmResults import io.realm.RealmResults
@ -15,9 +16,11 @@ import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus
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.interfaces.NameManageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
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.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.extensions.toCurrency import net.pokeranalytics.android.util.extensions.toCurrency
@ -81,7 +84,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
} }
@Ignore @Ignore
override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT override val inputFragmentType: InputFragmentType = InputFragmentType.EDIT_TEXT
override fun localizedTitle(context: Context): String { override fun localizedTitle(context: Context): String {
return context.getString(R.string.value) return context.getString(R.string.value)
@ -91,12 +94,16 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
return if (value.isNotEmpty()) value else NULL_TEXT return if (value.isNotEmpty()) value else NULL_TEXT
} }
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? { override fun startEditing(dataSource: Any?, parent: Fragment?) {
val defaultValue: Any? by map if (parent == null) return
return arrayListOf( if (parent !is RowRepresentableDelegate) return
RowRepresentableEditDescriptor(defaultValue, R.string.value, InputType.TYPE_CLASS_TEXT) val data = RowEditableDataSource()
) data.append(this.value, R.string.value, InputType.TYPE_CLASS_TEXT)
} InputFragment.buildAndShow(this, parent, data, isDeletable = true)
}
override val valueCanBeClearedWhenEditing: Boolean
get() = false
override fun isValidForSave(): Boolean { override fun isValidForSave(): Boolean {
return true return true

@ -1,6 +1,7 @@
package net.pokeranalytics.android.model.realm package net.pokeranalytics.android.model.realm
import android.content.Context import android.content.Context
import androidx.fragment.app.Fragment
import io.realm.* import io.realm.*
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
@ -10,12 +11,11 @@ import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.* import net.pokeranalytics.android.model.interfaces.*
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.interfaces.FilterableType
import net.pokeranalytics.android.ui.view.ImageDecorator import net.pokeranalytics.android.ui.view.*
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.*
@ -193,20 +193,15 @@ open class Filter : RealmObject(), RowRepresentable, Editable, Deletable, Counta
return R.string.relationship_error return R.string.relationship_error
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return BottomSheetType.EDIT_TEXT return InputFragmentType.EDIT_TEXT
} }
override fun localizedTitle(context: Context): String { override fun localizedTitle(context: Context): String {
return context.getString(R.string.name) return context.getString(R.string.name)
} }
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? {
val defaultValue: String? by map
return arrayListOf(RowRepresentableEditDescriptor(defaultValue, R.string.name))
}
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
realm.executeTransaction { realm.executeTransaction {
val newName = value as String? ?: "" val newName = value as String? ?: ""
@ -215,4 +210,12 @@ open class Filter : RealmObject(), RowRepresentable, Editable, Deletable, Counta
} }
} }
} }
override fun startEditing(dataSource: Any?, parent: Fragment?) {
if (parent == null) return
if (parent !is RowRepresentableDelegate) return
val data = RowEditableDataSource()
data.append(this.name)
InputFragment.buildAndShow(this, parent, data, isDeletable = true, valueHasPlaceholder = false)
}
} }

@ -14,9 +14,7 @@ import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
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.rowrepresentable.GameRow import net.pokeranalytics.android.ui.view.rowrepresentable.GameRow
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -29,7 +27,7 @@ open class Game : RealmObject(), NameManageable, StaticRowRepresentableDataSourc
companion object { companion object {
val rowRepresentation : List<RowRepresentable> by lazy { val rowRepresentation : List<RowRepresentable> by lazy {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(GameRow.NAME)
// rows.addAll(GameRow.values()) // rows.addAll(GameRow.values())
rows rows
} }
@ -62,28 +60,20 @@ open class Game : RealmObject(), NameManageable, StaticRowRepresentableDataSourc
} }
override fun adapterRows(): List<RowRepresentable>? { override fun adapterRows(): List<RowRepresentable>? {
return Game.rowRepresentation return rowRepresentation
} }
override fun stringForRow(row: RowRepresentable): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> if (this.name.isNotEmpty()) this.name else NULL_TEXT GameRow.NAME -> if (this.name.isNotEmpty()) this.name else NULL_TEXT
GameRow.SHORT_NAME -> this.shortName ?: NULL_TEXT GameRow.SHORT_NAME -> this.shortName ?: NULL_TEXT
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return when (row) {
SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.name))
GameRow.SHORT_NAME -> row.editingDescriptors(mapOf("defaultValue" to this.shortName))
else -> null
}
}
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" GameRow.NAME -> this.name = value as String? ?: ""
GameRow.SHORT_NAME -> this.shortName = value as String? ?: "" GameRow.SHORT_NAME -> this.shortName = value as String? ?: ""
} }
} }

@ -834,117 +834,6 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return when (row) {
SessionRow.BANKROLL -> row.editingDescriptors(
mapOf(
"defaultValue" to this.bankroll,
"data" to realm.sorted<Bankroll>() // LiveData.Bankroll.items(realm)
)
)
SessionRow.GAME -> row.editingDescriptors(
mapOf(
"limit" to this.limit,
"defaultValue" to this.game,
"data" to realm.sorted<Game>() //LiveData.Game.items(realm)
)
)
SessionRow.LOCATION -> row.editingDescriptors(
mapOf(
"defaultValue" to this.location,
"data" to realm.sorted<Location>() // LiveData.Location.items(realm)
)
)
SessionRow.TOURNAMENT_FEATURE -> row.editingDescriptors(
mapOf(
"defaultValue" to this.tournamentFeatures,
"data" to realm.sorted<TournamentFeature>() //LiveData.TournamentFeature.items(realm)
)
)
SessionRow.TOURNAMENT_NAME -> row.editingDescriptors(
mapOf(
"defaultValue" to this.tournamentName,
"data" to realm.sorted<TournamentName>() //LiveData.TournamentName.items(realm)
)
)
SessionRow.TOURNAMENT_TYPE -> row.editingDescriptors(
mapOf(
"defaultValue" to this.tournamentType
)
)
SessionRow.TABLE_SIZE -> row.editingDescriptors(
mapOf(
"defaultValue" to this.tableSize
)
)
SessionRow.BLINDS -> row.editingDescriptors(
mapOf(
"sb" to cgSmallBlind?.round(),
"bb" to cgBigBlind?.round()
)
)
SessionRow.BUY_IN -> row.editingDescriptors(
mapOf(
"bb" to cgBigBlind,
"fee" to this.tournamentEntryFee,
"ratedBuyin" to result?.buyin
)
)
SessionRow.BREAK_TIME -> row.editingDescriptors(mapOf())
SessionRow.CASHED_OUT, SessionRow.PRIZE -> row.editingDescriptors(
mapOf(
"defaultValue" to result?.cashout
)
)
SessionRow.NET_RESULT -> row.editingDescriptors(
mapOf(
"defaultValue" to result?.netResult
)
)
SessionRow.COMMENT -> row.editingDescriptors(
mapOf(
"defaultValue" to this.comment
)
)
SessionRow.INITIAL_BUY_IN -> row.editingDescriptors(
mapOf(
"defaultValue" to this.tournamentEntryFee
)
)
SessionRow.PLAYERS -> row.editingDescriptors(
mapOf(
"defaultValue" to this.tournamentNumberOfPlayers
)
)
SessionRow.POSITION -> row.editingDescriptors(
mapOf(
"defaultValue" to this.result?.tournamentFinalPosition
)
)
SessionRow.TIPS -> row.editingDescriptors(
mapOf(
"sb" to cgSmallBlind?.round(),
"bb" to cgBigBlind?.round(),
"tips" to result?.tips
)
)
is CustomField -> {
row.editingDescriptors(
when (row.type) {
CustomField.Type.LIST.uniqueIdentifier -> mapOf(
"defaultValue" to customFieldEntries.find { it.customField?.id == row.id }?.value,
"data" to row.entries
)
else -> mapOf(
"defaultValue" to customFieldEntries.find { it.customField?.id == row.id }?.numericValue
)
}
)
}
else -> null
}
}
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
realm.executeTransaction { realm.executeTransaction {

@ -233,7 +233,7 @@
// //
// /** // /**
// * Multiple session sets update: // * Multiple session sets update:
// * Merges all sets into one (delete all then create a new one) // * Merges all sets into one (delete all then buildAndShow a new one)
// */ // */
// private fun mergeSessionGroups(owner: Session, sessionSets: RealmResults<SessionSet>) { // private fun mergeSessionGroups(owner: Session, sessionSets: RealmResults<SessionSet>) {
// //

@ -14,8 +14,6 @@ import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
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.rowrepresentable.SimpleRow
import net.pokeranalytics.android.ui.view.rowrepresentable.TournamentFeatureRow import net.pokeranalytics.android.ui.view.rowrepresentable.TournamentFeatureRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import java.util.* import java.util.*
@ -27,7 +25,6 @@ open class TournamentFeature : RealmObject(), NameManageable, StaticRowRepresent
companion object { companion object {
val rowRepresentation : List<RowRepresentable> by lazy { val rowRepresentation : List<RowRepresentable> by lazy {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
rows.addAll(TournamentFeatureRow.values()) rows.addAll(TournamentFeatureRow.values())
rows rows
} }
@ -53,24 +50,19 @@ open class TournamentFeature : RealmObject(), NameManageable, StaticRowRepresent
} }
override fun adapterRows(): List<RowRepresentable>? { override fun adapterRows(): List<RowRepresentable>? {
return TournamentFeature.rowRepresentation return rowRepresentation
} }
override fun stringForRow(row: RowRepresentable): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> if (this.name.isNotEmpty()) this.name else NULL_TEXT TournamentFeatureRow.NAME -> if (this.name.isNotEmpty()) this.name else NULL_TEXT
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return row.editingDescriptors(mapOf(
"defaultValue" to this.name))
}
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" TournamentFeatureRow.NAME -> this.name = value as String? ?: ""
} }
} }

@ -12,8 +12,6 @@ import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
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.rowrepresentable.SimpleRow
import net.pokeranalytics.android.ui.view.rowrepresentable.TournamentNameRow import net.pokeranalytics.android.ui.view.rowrepresentable.TournamentNameRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import java.util.* import java.util.*
@ -24,7 +22,6 @@ open class TournamentName : RealmObject(), NameManageable, StaticRowRepresentabl
companion object { companion object {
val rowRepresentation : List<RowRepresentable> by lazy { val rowRepresentation : List<RowRepresentable> by lazy {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
rows.addAll(TournamentNameRow.values()) rows.addAll(TournamentNameRow.values())
rows rows
} }
@ -45,25 +42,21 @@ open class TournamentName : RealmObject(), NameManageable, StaticRowRepresentabl
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" TournamentNameRow.NAME -> this.name = value as String? ?: ""
} }
} }
override fun adapterRows(): List<RowRepresentable>? { override fun adapterRows(): List<RowRepresentable>? {
return TournamentName.rowRepresentation return rowRepresentation
} }
override fun stringForRow(row: RowRepresentable): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> if (this.name.isNotEmpty()) this.name else NULL_TEXT TournamentNameRow.NAME -> if (this.name.isNotEmpty()) this.name else NULL_TEXT
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return row.editingDescriptors(mapOf("defaultValue" to this.name))
}
override fun getFailedSaveMessage(status: SaveValidityStatus): Int { override fun getFailedSaveMessage(status: SaveValidityStatus): Int {
return when (status) { return when (status) {
SaveValidityStatus.DATA_INVALID -> R.string.tournament_name_empty_field_error SaveValidityStatus.DATA_INVALID -> R.string.tournament_name_empty_field_error

@ -12,8 +12,6 @@ import net.pokeranalytics.android.model.interfaces.*
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.view.Localizable import net.pokeranalytics.android.ui.view.Localizable
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.rowrepresentable.SimpleRow
import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionTypeRow import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionTypeRow
import net.pokeranalytics.android.util.enumerations.IntIdentifiable import net.pokeranalytics.android.util.enumerations.IntIdentifiable
import net.pokeranalytics.android.util.enumerations.IntSearchable import net.pokeranalytics.android.util.enumerations.IntSearchable
@ -55,7 +53,6 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab
companion object { companion object {
val rowRepresentation: List<RowRepresentable> by lazy { val rowRepresentation: List<RowRepresentable> by lazy {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
rows.addAll(TransactionTypeRow.values()) rows.addAll(TransactionTypeRow.values())
rows rows
} }
@ -108,7 +105,7 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab
override fun stringForRow(row: RowRepresentable): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> this.name TransactionTypeRow.NAME -> this.name
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
} }
} }
@ -120,13 +117,9 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return row.editingDescriptors(mapOf("defaultValue" to this.name))
}
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" TransactionTypeRow.NAME -> this.name = value as String? ?: ""
TransactionTypeRow.TRANSACTION_ADDITIVE -> this.additive = value as Boolean? ?: false TransactionTypeRow.TRANSACTION_ADDITIVE -> this.additive = value as Boolean? ?: false
} }
} }

@ -97,7 +97,7 @@ class SessionSetManager {
/** /**
* Multiple session sets update: * Multiple session sets update:
* Merges all sets into one (delete all then create a new one) * Merges all sets into one (delete all then buildAndShow a new one)
*/ */
private fun mergeSessionGroups(session: Session, sessionSets: RealmResults<SessionSet>) { private fun mergeSessionGroups(session: Session, sessionSets: RealmResults<SessionSet>) {

@ -7,10 +7,13 @@ import net.pokeranalytics.android.ui.view.BindableHolder
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
interface RowRepresentableDelegate { interface RowRepresentableDelegate: RowEditableDelegate {
fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean = false) {} fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean = false) {}
fun onRowValueChanged(value: Any?, row: RowRepresentable) {} }
fun onRowDeleted(row: RowRepresentable) {}
interface RowEditableDelegate {
fun onRowValueChanged(value: Any?, row: RowRepresentable) {}
fun onRowDeleted(row: RowRepresentable) {}
} }
/** /**

@ -3,13 +3,12 @@ package net.pokeranalytics.android.ui.adapter
import android.content.Context import android.content.Context
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
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.util.TextFormat import net.pokeranalytics.android.util.TextFormat
/** /**
* Base Interface to provide the RowRepresentable to the adapter * Base Interface to provide the RowRepresentable to the adapter
*/ */
interface RowRepresentableDataSource: EditableDataSource, DisplayableDataSource, SelectableDataSource { interface RowRepresentableDataSource: DisplayableDataSource, SelectableDataSource {
/** /**
* Returns a prebuild list of rows * Returns a prebuild list of rows
@ -161,18 +160,6 @@ interface DisplayableDataSource {
} }
} }
/**
* An interface providing a way to describe how the edition of a [RowRepresentable] will be displayed
*/
interface EditableDataSource {
/**
* A list of [RowRepresentableEditDescriptor] object specifying the way the edition will be handled
*/
fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return null
}
}
/** /**
* An interface providing a way to select a row * An interface providing a way to select a row

@ -18,8 +18,6 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.helpers.DateTimePickerManager
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.ui.view.rowrepresentable.FilterCategoryRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow
@ -65,35 +63,7 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataSo
updateRowsSelection(row) updateRowsSelection(row)
return return
} }
row.startEditing(null, this)
when (row) {
is QueryCondition.DateQuery -> DateTimePickerManager.create(
requireContext(),
row,
this,
row.singleValue,
onlyDate = !row.showTime,
onlyTime = row.showTime
)
is QueryCondition.Duration -> {
var hours: String? = null
var minutes: String? = null
row.minutes?.let {
hours = if (it / 60 > 0) (it / 60).toString() else null
minutes = if (it % 60 > 0) (it % 60).toString() else null
}
val data = row.editingDescriptors(mapOf("hours" to hours, "minutes" to minutes))
BottomSheetFragment.create(fragmentManager, row, this, data, true)
}
is QueryCondition.ListOfValues<*> -> {
var valueAsString: String? = null
row.listOfValues.firstOrNull()?.let {
valueAsString = row.listOfValues.firstOrNull()?.toString()
}
val data = row.editingDescriptors(mapOf("valueAsString" to valueAsString))
BottomSheetFragment.create(fragmentManager, row, this, data, true)
}
}
} }
override fun stringForRow(row: RowRepresentable, context: Context): String { override fun stringForRow(row: RowRepresentable, context: Context): String {

@ -10,10 +10,8 @@ import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.interfaces.FilterHandler.Companion.INTENT_FILTER_UPDATE_FILTER_UI import net.pokeranalytics.android.ui.interfaces.FilterHandler.Companion.INTENT_FILTER_UPDATE_FILTER_UI
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.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.Preferences
import timber.log.Timber import timber.log.Timber
@ -55,13 +53,6 @@ open class FiltersListFragment : DataListFragment() {
return if (viewType != -1) viewType else RowViewType.DATA.ordinal return if (viewType != -1) viewType else RowViewType.DATA.ordinal
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return when (row) {
is Filter -> row.editingDescriptors(mapOf("defaultValue" to row.name))
else -> super.editDescriptors(row)
}
}
override fun onRowValueChanged(value: Any?, row: RowRepresentable) { override fun onRowValueChanged(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
is Filter -> { is Filter -> {
@ -91,8 +82,7 @@ open class FiltersListFragment : DataListFragment() {
when (row) { when (row) {
is Filter -> { is Filter -> {
if (fromAction) { if (fromAction) {
val data = row.editingDescriptors(mapOf("defaultValue" to row.name)) row.startEditing(null, this)
BottomSheetFragment.create(fragmentManager, row, this, data, false, isDeletable = true, valueHasPlaceholder = false)
} else { } else {
val intent = Intent() val intent = Intent()
intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, row.id) intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, row.id)

@ -23,8 +23,6 @@ import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.helpers.DateTimePickerManager
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableDiffCallback import net.pokeranalytics.android.ui.view.RowRepresentableDiffCallback
import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
@ -82,7 +80,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate {
} else { } else {
throw PAIllegalStateException("Session cannot be null here, session id = $sessionId") throw PAIllegalStateException("Session cannot be null here, session id = $sessionId")
} }
} else { // create new session } else { // buildAndShow new session
realm.executeTransaction { executeRealm -> realm.executeTransaction { executeRealm ->
currentSession = Session.newInstance(executeRealm, isTournament) currentSession = Session.newInstance(executeRealm, isTournament)
FavoriteSessionFinder.copyParametersFromFavoriteSession(currentSession, null, requireContext()) FavoriteSessionFinder.copyParametersFromFavoriteSession(currentSession, null, requireContext())
@ -158,30 +156,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate {
Toast.makeText(requireContext(), "Action for row: $row", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "Action for row: $row", Toast.LENGTH_SHORT).show()
return return
} }
row.startEditing(currentSession, this)
val data = currentSession.editDescriptors(row)
when (row) {
SessionRow.START_DATE -> DateTimePickerManager.create(requireContext(), row, this, currentSession.startDate)
SessionRow.END_DATE -> {
if (this.currentSession.startDate == null) {
Toast.makeText(context, R.string.session_missing_start_date, Toast.LENGTH_SHORT).show()
} else {
DateTimePickerManager.create(
requireContext(),
row,
this,
currentSession.endDate ?: currentSession.startDate ?: Date(),
currentSession.startDate
)
}
}
SessionRow.BANKROLL -> {
BottomSheetFragment.create(fragmentManager, row, this, data, false, currentSession.currency)
}
else -> BottomSheetFragment.create(fragmentManager, row, this, data, currentCurrency = currentSession.currency)
}
} }
override fun onRowValueChanged(value: Any?, row: RowRepresentable) { override fun onRowValueChanged(value: Any?, row: RowRepresentable) {

@ -78,7 +78,7 @@ abstract class DeletableItemFragment : RealmFragment() {
this.dataListAdapter = dataListAdapter this.dataListAdapter = dataListAdapter
// Save the delete position & create a copy of the object // Save the delete position & buildAndShow a copy of the object
val itemPosition = items.indexOfFirst { it.id == itemId } val itemPosition = items.indexOfFirst { it.id == itemId }
val itemToDelete = items.find { it.id == itemId } val itemToDelete = items.find { it.id == itemId }

@ -1,50 +0,0 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet
import net.pokeranalytics.android.ui.view.RowRepresentable
enum class BottomSheetType {
NONE,
LIST,
LIST_STATIC,
LIST_GAME,
DOUBLE_LIST,
MULTI_SELECTION,
GRID,
EDIT_TEXT,
EDIT_TEXT_MULTI_LINES,
DOUBLE_EDIT_TEXT,
NUMERIC_TEXT,
SUM;
fun newInstance(row: RowRepresentable): BottomSheetFragment {
return when (this) {
NONE -> BottomSheetFragment(row)
LIST -> BottomSheetListFragment(row)
LIST_STATIC -> BottomSheetStaticListFragment(row)
LIST_GAME -> BottomSheetListGameFragment(row)
DOUBLE_LIST -> BottomSheetListGameFragment(row)
MULTI_SELECTION -> BottomSheetMultiSelectionFragment(row)
GRID -> BottomSheetTableSizeGridFragment(row)
EDIT_TEXT -> BottomSheetEditTextFragment(row)
EDIT_TEXT_MULTI_LINES -> BottomSheetEditTextMultiLinesFragment(row)
DOUBLE_EDIT_TEXT -> BottomSheetDoubleEditTextFragment(row)
NUMERIC_TEXT -> BottomSheetNumericTextFragment(row)
SUM -> BottomSheetSumFragment(row)
}
}
val validationRequired: Boolean
get() = when (this) {
LIST, LIST_GAME, LIST_STATIC, GRID, DOUBLE_LIST -> false
else -> true
}
val clearRequired: Boolean
get() = true
val addRequired: Boolean
get() = when (this) {
EDIT_TEXT, NUMERIC_TEXT, DOUBLE_EDIT_TEXT, EDIT_TEXT_MULTI_LINES, GRID, LIST_STATIC, SUM -> false
else -> true
}
}

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.os.Bundle import android.os.Bundle
import android.text.InputType import android.text.InputType
@ -15,7 +15,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow
import net.pokeranalytics.android.util.extensions.round import net.pokeranalytics.android.util.extensions.round
class BottomSheetDoubleEditTextFragment(row: RowRepresentable) : BottomSheetFragment(row) { class InputDoubleEditTextFragment(row: RowRepresentable) : InputFragment(row) {
private val values = ArrayList<String>() private val values = ArrayList<String>()
private var isEditingBlinds: Boolean = false private var isEditingBlinds: Boolean = false
@ -52,9 +52,9 @@ class BottomSheetDoubleEditTextFragment(row: RowRepresentable) : BottomSheetFrag
* Init UI * Init UI
*/ */
private fun initUI() { private fun initUI() {
val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") val data = getData()?:throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (data.size != 2) { if (data.size != 2) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
} }
values.add(0, "") values.add(0, "")

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.os.Bundle import android.os.Bundle
import android.text.InputType import android.text.InputType
@ -13,7 +13,7 @@ import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorExcep
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
class BottomSheetEditTextFragment(row: RowRepresentable) : BottomSheetFragment(row) { class InputEditTextFragment(row: RowRepresentable) : InputFragment(row) {
private var value: String? = null private var value: String? = null
@ -51,9 +51,9 @@ class BottomSheetEditTextFragment(row: RowRepresentable) : BottomSheetFragment(r
*/ */
private fun initUI() { private fun initUI() {
val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") val data = getData()?:throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (data.size != 1) { if (data.size != 1) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
} }
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_edit_text, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_edit_text, view?.bottomSheetContainer, true)

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.os.Bundle import android.os.Bundle
import android.text.InputType import android.text.InputType
@ -11,7 +11,7 @@ import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorExcep
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
class BottomSheetEditTextMultiLinesFragment(row: RowRepresentable) : BottomSheetFragment(row) { class InputEditTextMultiLinesFragment(row: RowRepresentable) : InputFragment(row) {
private var value: String? = null private var value: String? = null
@ -43,9 +43,9 @@ class BottomSheetEditTextMultiLinesFragment(row: RowRepresentable) : BottomSheet
* Init UI * Init UI
*/ */
private fun initUI() { private fun initUI() {
val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") val data = getData()?:throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (data.size != 1) { if (data.size != 1) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
} }
LayoutInflater.from(requireContext()).inflate(net.pokeranalytics.android.R.layout.bottom_sheet_edit_text_multi_lines, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(net.pokeranalytics.android.R.layout.bottom_sheet_edit_text_multi_lines, view?.bottomSheetContainer, true)

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity.RESULT_OK import android.app.Activity.RESULT_OK
@ -10,58 +10,59 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import androidx.appcompat.view.ContextThemeWrapper import androidx.appcompat.view.ContextThemeWrapper
import androidx.fragment.app.FragmentManager import androidx.fragment.app.Fragment
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import io.realm.RealmModel import io.realm.RealmModel
import kotlinx.android.synthetic.main.fragment_bottom_sheet.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowEditableDelegate
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.helpers.DateTimePickerManager
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.*
import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow
import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow
import java.util.* import java.util.*
open class BottomSheetFragment(val row: RowRepresentable) : BottomSheetDialogFragment() { open class InputFragment(val row: RowRepresentable) : BottomSheetDialogFragment() {
// lateinit var row: RowRepresentable // lateinit var row: RowRepresentable
lateinit var delegate: RowRepresentableDelegate lateinit var delegate: RowEditableDelegate
var currentCurrency: Currency? = null var currentCurrency: Currency? = null
var valueHasPlaceholder: Boolean = false var valueHasPlaceholder: Boolean = false
private var isClearable: Boolean = true private var isClearable: Boolean = true
private var isDeletable: Boolean = false private var isDeletable: Boolean = false
private var rowRepresentableEditDescriptors: ArrayList<RowRepresentableEditDescriptor>? = null private var rowEditableDescriptors: ArrayList<RowEditableDescriptor>? = null
companion object { companion object {
const val REQUEST_CODE_ADD_NEW_OBJECT = 100 const val REQUEST_CODE_ADD_NEW_OBJECT = 100
fun create( fun buildAndShow(
fragmentManager: FragmentManager?, row: RowRepresentable,
row: RowRepresentable, delegate: RowEditableDelegate,
delegate: RowRepresentableDelegate, dataSource: RowEditableDataSource?,
rowRepresentableEditDescriptors: ArrayList<RowRepresentableEditDescriptor>?, isDeletable: Boolean? = false,
isClearable: Boolean? = true, valueHasPlaceholder: Boolean? = null
currentCurrency: Currency? = null, ) {
isDeletable: Boolean? = false, if (delegate !is Fragment) throw PokerAnalyticsException.InputFragmentException
valueHasPlaceholder: Boolean? = null if (dataSource?.descriptorType == RowEditableDescriptorType.DATE) {
): BottomSheetFragment { DateTimePickerManager.buildAndShow(row, delegate, dataSource.descriptors.first())
val bottomSheetFragment = row.bottomSheetType.newInstance(row) } else {
bottomSheetFragment.show(fragmentManager, "bottomSheet") val bottomSheetFragment = row.inputFragmentType.newInstance(row)
// bottomSheetFragment.row = row bottomSheetFragment.show(delegate.fragmentManager, "bottomSheet")
bottomSheetFragment.delegate = delegate bottomSheetFragment.delegate = delegate
bottomSheetFragment.rowRepresentableEditDescriptors = rowRepresentableEditDescriptors bottomSheetFragment.rowEditableDescriptors = dataSource?.descriptors
bottomSheetFragment.isClearable = isClearable ?: true bottomSheetFragment.isClearable = row.valueCanBeClearedWhenEditing
bottomSheetFragment.isDeletable = isDeletable ?: true bottomSheetFragment.isDeletable = isDeletable ?: true
bottomSheetFragment.valueHasPlaceholder = valueHasPlaceholder ?: true bottomSheetFragment.valueHasPlaceholder = valueHasPlaceholder ?: true
bottomSheetFragment.currentCurrency = currentCurrency bottomSheetFragment.currentCurrency = dataSource?.currency
return bottomSheetFragment }
} }
} }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@ -108,9 +109,9 @@ open class BottomSheetFragment(val row: RowRepresentable) : BottomSheetDialogFra
bottomSheetToolbar.setOnMenuItemClickListener { bottomSheetToolbar.setOnMenuItemClickListener {
false false
} }
bottomSheetToolbar.menu.findItem(R.id.actionCheck).isVisible = row.bottomSheetType.validationRequired bottomSheetToolbar.menu.findItem(R.id.actionCheck).isVisible = row.inputFragmentType.validationRequired
bottomSheetToolbar.menu.findItem(R.id.actionClear).isVisible = row.bottomSheetType.clearRequired bottomSheetToolbar.menu.findItem(R.id.actionClear).isVisible = row.inputFragmentType.clearRequired
bottomSheetToolbar.menu.findItem(R.id.actionAdd).isVisible = row.bottomSheetType.addRequired bottomSheetToolbar.menu.findItem(R.id.actionAdd).isVisible = row.inputFragmentType.addRequired
// Menu // Menu
bottomSheetToolbar.menu.findItem(R.id.actionClear).setOnMenuItemClickListener { bottomSheetToolbar.menu.findItem(R.id.actionClear).setOnMenuItemClickListener {
@ -158,8 +159,8 @@ open class BottomSheetFragment(val row: RowRepresentable) : BottomSheetDialogFra
/** /**
* Return the data list * Return the data list
*/ */
fun getData(): ArrayList<RowRepresentableEditDescriptor>? { fun getData(): ArrayList<RowEditableDescriptor>? {
return this.rowRepresentableEditDescriptors return this.rowEditableDescriptors
} }
open fun getValue(): Any? { open fun getValue(): Any? {

@ -0,0 +1,50 @@
package net.pokeranalytics.android.ui.fragment.components.input
import net.pokeranalytics.android.ui.view.RowRepresentable
enum class InputFragmentType {
NONE,
LIST,
LIST_STATIC,
LIST_GAME,
DOUBLE_LIST,
MULTI_SELECTION,
GRID,
EDIT_TEXT,
EDIT_TEXT_MULTI_LINES,
DOUBLE_EDIT_TEXT,
NUMERIC_TEXT,
SUM;
fun newInstance(row: RowRepresentable): InputFragment {
return when (this) {
NONE -> InputFragment(row)
LIST -> InputListFragment(row)
LIST_STATIC -> InputStaticListFragment(row)
LIST_GAME -> InputListGameFragment(row)
DOUBLE_LIST -> InputListGameFragment(row)
MULTI_SELECTION -> InputMultiSelectionFragment(row)
GRID -> InputTableSizeGridFragment(row)
EDIT_TEXT -> InputEditTextFragment(row)
EDIT_TEXT_MULTI_LINES -> InputEditTextMultiLinesFragment(row)
DOUBLE_EDIT_TEXT -> InputDoubleEditTextFragment(row)
NUMERIC_TEXT -> InputNumericTextFragment(row)
SUM -> InputSumFragment(row)
}
}
val validationRequired: Boolean
get() = when (this) {
LIST, LIST_GAME, LIST_STATIC, GRID, DOUBLE_LIST -> false
else -> true
}
val clearRequired: Boolean
get() = true
val addRequired: Boolean
get() = when (this) {
EDIT_TEXT, NUMERIC_TEXT, DOUBLE_EDIT_TEXT, EDIT_TEXT_MULTI_LINES, GRID, LIST_STATIC, SUM -> false
else -> true
}
}

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -13,10 +13,11 @@ import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorExcep
import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.view.DataRowEditableDescriptor
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
open class BottomSheetListFragment(row: RowRepresentable) : BottomSheetFragment(row), LiveRowRepresentableDataSource, RowRepresentableDelegate { open class InputListFragment(row: RowRepresentable) : InputFragment(row), LiveRowRepresentableDataSource, RowRepresentableDelegate {
lateinit var dataAdapter: RowRepresentableAdapter lateinit var dataAdapter: RowRepresentableAdapter
var realmData: RealmResults<RowRepresentable>? = null var realmData: RealmResults<RowRepresentable>? = null
@ -69,14 +70,14 @@ open class BottomSheetListFragment(row: RowRepresentable) : BottomSheetFragment(
* Init data * Init data
*/ */
open fun initData() { open fun initData() {
val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (bottomSheetData.size != 1) { if (bottomSheetData.size != 1) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
} }
if (bottomSheetData.first().data == null) { val dataList = bottomSheetData[0]
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") if (dataList !is DataRowEditableDescriptor) { throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency") }
} if (dataList.data == null) { throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency") }
this.realmData = bottomSheetData.first().data as RealmResults<RowRepresentable> this.realmData = dataList.data
} }
/** /**

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -13,13 +13,14 @@ import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorExcep
import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.extensions.px
import net.pokeranalytics.android.ui.view.DataRowEditableDescriptor
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
/** /**
* Bottom Sheet List Game Fragment * Bottom Sheet List Game Fragment
* Display a list of game + chips to choose the game limit * Display a list of game + chips to choose the game limit
*/ */
class BottomSheetListGameFragment(row: RowRepresentable) : BottomSheetListFragment(row) { class InputListGameFragment(row: RowRepresentable) : InputListFragment(row) {
private var limit: Int? = 0 private var limit: Int? = 0
private val values = ArrayList<Any?>() private val values = ArrayList<Any?>()
@ -49,15 +50,15 @@ class BottomSheetListGameFragment(row: RowRepresentable) : BottomSheetListFragme
* Init data * Init data
*/ */
override fun initData() { override fun initData() {
val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (bottomSheetData.size != 2) { if (bottomSheetData.size != 2) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
}
if (bottomSheetData[1].data == null) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency")
} }
val dataList = bottomSheetData[1]
if (dataList !is DataRowEditableDescriptor) { throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency") }
if (dataList.data == null) { throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency") }
this.realmData = dataList.data
this.limit = bottomSheetData[0].defaultValue as Int? this.limit = bottomSheetData[0].defaultValue as Int?
this.realmData = bottomSheetData[1].data
} }
/** /**

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
@ -14,7 +14,7 @@ import net.pokeranalytics.android.ui.view.RowViewType
/** /**
* Manage multiple items selection in a bottom sheet list * Manage multiple items selection in a bottom sheet list
*/ */
open class BottomSheetMultiSelectionFragment(row: RowRepresentable) : BottomSheetListFragment(row) { open class InputMultiSelectionFragment(row: RowRepresentable) : InputListFragment(row) {
private val selectedRows: ArrayList<RowRepresentable> = ArrayList() private val selectedRows: ArrayList<RowRepresentable> = ArrayList()
@ -54,9 +54,9 @@ open class BottomSheetMultiSelectionFragment(row: RowRepresentable) : BottomShee
override fun initData() { override fun initData() {
super.initData() super.initData()
val bottomSheetData = val bottomSheetData =
getData() ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") getData() ?: throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (bottomSheetData.size != 1) { if (bottomSheetData.size != 1) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
} }
bottomSheetData.first().defaultValue?.let { bottomSheetData.first().defaultValue?.let {
(it as RealmList<*>).forEach { row -> (it as RealmList<*>).forEach { row ->

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.os.Bundle import android.os.Bundle
import android.text.InputType import android.text.InputType
@ -14,7 +14,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable
import java.text.NumberFormat import java.text.NumberFormat
class BottomSheetNumericTextFragment(row: RowRepresentable) : BottomSheetFragment(row) { class InputNumericTextFragment(row: RowRepresentable) : InputFragment(row) {
private var value: Double? = null private var value: Double? = null
@ -43,9 +43,9 @@ class BottomSheetNumericTextFragment(row: RowRepresentable) : BottomSheetFragmen
* Init UI * Init UI
*/ */
private fun initUI() { private fun initUI() {
val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") val data = getData()?:throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (data.size != 1) { if (data.size != 1) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
} }
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_edit_text, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_edit_text, view?.bottomSheetContainer, true)

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -12,8 +12,9 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.StaticDataRowEditableDescriptor
class BottomSheetStaticListFragment(row: RowRepresentable) : BottomSheetFragment(row), StaticRowRepresentableDataSource, class InputStaticListFragment(row: RowRepresentable) : InputFragment(row), StaticRowRepresentableDataSource,
RowRepresentableDelegate { RowRepresentableDelegate {
private var staticRows: List<RowRepresentable> = emptyList() private var staticRows: List<RowRepresentable> = emptyList()
@ -44,14 +45,14 @@ class BottomSheetStaticListFragment(row: RowRepresentable) : BottomSheetFragment
* Init data * Init data
*/ */
private fun initData() { private fun initData() {
val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (bottomSheetData.size != 1) { if (bottomSheetData.size != 1) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
} }
if (bottomSheetData.first().staticData == null) { val dataList = bottomSheetData[0]
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") if (dataList !is StaticDataRowEditableDescriptor) { throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency") }
} if (dataList.staticData == null) { throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency") }
this.staticRows = bottomSheetData.first().staticData as List<RowRepresentable> this.staticRows= dataList.staticData as List<RowRepresentable>
} }
/** /**

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.os.Bundle import android.os.Bundle
import android.text.InputType import android.text.InputType
@ -16,7 +16,7 @@ import net.pokeranalytics.android.util.extensions.toCurrency
import java.text.NumberFormat import java.text.NumberFormat
class BottomSheetSumFragment(row: RowRepresentable) : BottomSheetFragment(row) { class InputSumFragment(row: RowRepresentable) : InputFragment(row) {
private var value = 0.0 private var value = 0.0
private var currentDefaultValue = 0.0 private var currentDefaultValue = 0.0
@ -50,9 +50,9 @@ class BottomSheetSumFragment(row: RowRepresentable) : BottomSheetFragment(row) {
* Init UI * Init UI
*/ */
private fun initUI() { private fun initUI() {
val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") val data = getData()?:throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (data.size != 5) { if (data.size != 5) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
} }
LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_sum, view?.bottomSheetContainer, true) LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_sum, view?.bottomSheetContainer, true)

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment.components.bottomsheet package net.pokeranalytics.android.ui.fragment.components.input
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -15,7 +15,7 @@ import net.pokeranalytics.android.ui.extensions.px
import net.pokeranalytics.android.ui.view.GridSpacingItemDecoration import net.pokeranalytics.android.ui.view.GridSpacingItemDecoration
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
class BottomSheetTableSizeGridFragment(row: RowRepresentable) : BottomSheetFragment(row), StaticRowRepresentableDataSource, RowRepresentableDelegate { class InputTableSizeGridFragment(row: RowRepresentable) : InputFragment(row), StaticRowRepresentableDataSource, RowRepresentableDelegate {
private lateinit var dataAdapter: RowRepresentableAdapter private lateinit var dataAdapter: RowRepresentableAdapter
private var defaultSize: Int? = null private var defaultSize: Int? = null
@ -39,9 +39,9 @@ class BottomSheetTableSizeGridFragment(row: RowRepresentable) : BottomSheetFragm
* Init data * Init data
*/ */
private fun initData() { private fun initData() {
val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowEditableDescriptor not found")
if (bottomSheetData.size != 1) { if (bottomSheetData.size != 1) {
throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
} }
defaultSize = bottomSheetData.first().defaultValue as Int? defaultSize = bottomSheetData.first().defaultValue as Int?
} }

@ -14,11 +14,9 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.CurrenciesFragment import net.pokeranalytics.android.ui.fragment.CurrenciesFragment
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.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollRow import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollRow
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.UserDefaults
import net.pokeranalytics.android.util.extensions.toCurrency import net.pokeranalytics.android.util.extensions.toCurrency
@ -85,7 +83,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
override fun stringForRow(row: RowRepresentable): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> if (bankroll.name.isNotEmpty()) bankroll.name else NULL_TEXT BankrollRow.NAME -> if (bankroll.name.isNotEmpty()) bankroll.name else NULL_TEXT
BankrollRow.CURRENCY -> { BankrollRow.CURRENCY -> {
bankroll.currency?.code?.let { code -> bankroll.currency?.code?.let { code ->
Currency.getInstance(code).currencyCode Currency.getInstance(code).currencyCode
@ -116,20 +114,6 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return when (row) {
SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.bankroll.name))
BankrollRow.INITIAL_VALUE -> {
row.editingDescriptors(mapOf("defaultValue" to this.bankroll.initialValue))
}
BankrollRow.RATE -> {
val rate = this.bankroll.currency?.rate
row.editingDescriptors(mapOf("defaultValue" to rate))
}
else -> null
}
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) { when (row) {
BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollDataFragment, BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollDataFragment,
@ -174,7 +158,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
private fun refreshRows() { private fun refreshRows() {
rows.clear() rows.clear()
rows.add(SimpleRow.NAME) rows.add(BankrollRow.NAME)
rows.add(BankrollRow.LIVE) rows.add(BankrollRow.LIVE)
rows.add(BankrollRow.INITIAL_VALUE) rows.add(BankrollRow.INITIAL_VALUE)
rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.currency)) rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.currency))

@ -17,11 +17,8 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.extensions.ChipGroupExtension import net.pokeranalytics.android.ui.extensions.ChipGroupExtension
import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.extensions.px
import net.pokeranalytics.android.ui.extensions.showAlertDialog import net.pokeranalytics.android.ui.extensions.showAlertDialog
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
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.rowrepresentable.CustomFieldRow import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import java.util.* import java.util.*
@ -122,7 +119,7 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa
override fun stringForRow(row: RowRepresentable): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> if (customField.name.isNotEmpty()) customField.name else NULL_TEXT CustomFieldRow.NAME -> if (customField.name.isNotEmpty()) customField.name else NULL_TEXT
else -> super.stringForRow(row) else -> super.stringForRow(row)
} }
} }
@ -142,20 +139,19 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? { /*
override fun editDescriptors(row: RowRepresentable): ArrayList<RowEditableDescriptor>? {
return when (row) { return when (row) {
SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.customField.name)) SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.customField.name))
is CustomFieldEntry -> row.editingDescriptors(mapOf("defaultValue" to row.value)) is CustomFieldEntry -> row.editingDescriptors(mapOf("defaultValue" to row.value))
else -> null else -> null
} }
} }
*/
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) { when (row) {
is CustomFieldEntry -> { is CustomFieldEntry -> row.startEditing(null, this)
val data = customField.editDescriptors(row)
BottomSheetFragment.create(fragmentManager, row, this, data, isClearable = false, isDeletable = true)
}
else -> super.onRowSelected(position, row, fromAction) else -> super.onRowSelected(position, row, fromAction)
} }
} }

@ -14,7 +14,6 @@ import net.pokeranalytics.android.model.interfaces.Editable
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
@ -62,7 +61,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat
} }
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
BottomSheetFragment.create(fragmentManager, row, this, getDataSource().editDescriptors(row)) row.startEditing(this.item, this)
} }
override fun onRowValueChanged(value: Any?, row: RowRepresentable) { override fun onRowValueChanged(value: Any?, row: RowRepresentable) {

@ -8,11 +8,9 @@ import net.pokeranalytics.android.model.realm.Location
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
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.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
/** /**
@ -47,7 +45,7 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
} else if (locationActivated) { } else if (locationActivated) {
// If we create a new location, we try to locate the user by default // If we buildAndShow a new location, we try to locate the user by default
isLookingForPlaces = true isLookingForPlaces = true
getSuggestionsPlaces() getSuggestionsPlaces()
@ -66,7 +64,7 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
override fun stringForRow(row: RowRepresentable): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> if (location.name.isNotEmpty())location.name else NULL_TEXT LocationRow.NAME -> if (location.name.isNotEmpty())location.name else NULL_TEXT
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
} }
} }
@ -78,13 +76,6 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return when (row) {
SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.location.name))
else -> null
}
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
// If we click on a location row, save the location (and finish activity) // If we click on a location row, save the location (and finish activity)
placesForRows[row]?.place?.let { place -> placesForRows[row]?.place?.let { place ->
@ -128,7 +119,7 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS
*/ */
private fun refreshRows() { private fun refreshRows() {
rows.clear() rows.clear()
rows.add(SimpleRow.NAME) rows.add(LocationRow.NAME)
rows.add(LocationRow.LOCATION_PERMISSION_SWITCH) rows.add(LocationRow.LOCATION_PERMISSION_SWITCH)
// Add info row to explain why we need the location permission // Add info row to explain why we need the location permission
rows.add(CustomizableRowRepresentable(customViewType = RowViewType.INFO, resId = R.string.location_when_in_use_usage_description)) rows.add(CustomizableRowRepresentable(customViewType = RowViewType.INFO, resId = R.string.location_when_in_use_usage_description))

@ -7,20 +7,14 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.pokeranalytics.android.calculus.bankroll.BankrollReportManager import net.pokeranalytics.android.calculus.bankroll.BankrollReportManager
import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.model.realm.TransactionType
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.helpers.DateTimePickerManager
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.rowrepresentable.TransactionRow import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.extensions.round import net.pokeranalytics.android.util.extensions.round
import net.pokeranalytics.android.util.extensions.shortDate import net.pokeranalytics.android.util.extensions.shortDate
import net.pokeranalytics.android.util.extensions.sorted
import java.util.*
/** /**
* Custom EditableDataFragment to manage the Transaction data * Custom EditableDataFragment to manage the Transaction data
@ -57,40 +51,6 @@ class TransactionDataFragment : EditableDataFragment(), StaticRowRepresentableDa
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return when (row) {
TransactionRow.BANKROLL -> row.editingDescriptors(
mapOf(
"defaultValue" to this.transaction.bankroll,
"data" to getRealm().sorted<Bankroll>()
)
)
TransactionRow.TYPE -> row.editingDescriptors(
mapOf(
"defaultValue" to this.transaction.type,
"data" to getRealm().sorted<TransactionType>()
)
)
TransactionRow.AMOUNT -> row.editingDescriptors(mapOf("defaultValue" to (if (this.transaction.amount != 0.0) this.transaction.amount.round() else "")))
TransactionRow.COMMENT -> row.editingDescriptors(mapOf("defaultValue" to this.transaction.comment))
else -> super.editDescriptors(row)
}
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) {
TransactionRow.DATE -> DateTimePickerManager.create(
requireContext(),
row,
this,
this.transaction.date,
onlyDate = true,
isClearable = false
)
else -> super.onRowSelected(position, row, fromAction)
}
}
override fun onRowValueChanged(value: Any?, row: RowRepresentable) { override fun onRowValueChanged(value: Any?, row: RowRepresentable) {
super.onRowValueChanged(value, row) super.onRowValueChanged(value, row)
rowRepresentableAdapter.refreshRow(row) rowRepresentableAdapter.refreshRow(row)

@ -4,7 +4,6 @@ import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.model.realm.TransactionType import net.pokeranalytics.android.model.realm.TransactionType
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
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.rowrepresentable.SimpleRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionTypeRow import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionTypeRow
@ -47,10 +46,6 @@ class TransactionTypeDataFragment : EditableDataFragment(), RowRepresentableData
} }
} }
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return row.editingDescriptors(mapOf("defaultValue" to this.transactionType.name))
}
override fun isEnabled(row: RowRepresentable): Boolean { override fun isEnabled(row: RowRepresentable): Boolean {
return when (row) { return when (row) {
TransactionTypeRow.TRANSACTION_ADDITIVE -> { TransactionTypeRow.TRANSACTION_ADDITIVE -> {

@ -8,9 +8,11 @@ import android.text.format.DateFormat
import android.widget.DatePicker import android.widget.DatePicker
import android.widget.TimePicker import android.widget.TimePicker
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.adapter.RowEditableDelegate
import net.pokeranalytics.android.ui.view.*
import java.util.* import java.util.*
class DateTimePickerManager : DatePickerDialog.OnDateSetListener, class DateTimePickerManager : DatePickerDialog.OnDateSetListener,
@ -19,7 +21,7 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener,
private var context: Context? = null private var context: Context? = null
private lateinit var row: RowRepresentable private lateinit var row: RowRepresentable
private lateinit var delegate: RowRepresentableDelegate private lateinit var delegate: RowEditableDelegate
private lateinit var calendar: Calendar private lateinit var calendar: Calendar
private var minimumDate: Date? = null private var minimumDate: Date? = null
private var onlyDate: Boolean = false private var onlyDate: Boolean = false
@ -27,39 +29,34 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener,
private var isClearable: Boolean = true private var isClearable: Boolean = true
companion object { companion object {
fun create( fun buildAndShow(
context: Context, row: RowRepresentable,
row: RowRepresentable, delegate: RowEditableDelegate,
delegate: RowRepresentableDelegate, dataSource: RowEditableDescriptor
date: Date?, ) {
minimumDate: Date? = null,
onlyDate: Boolean? = false, if (delegate !is Fragment) throw PokerAnalyticsException.InputFragmentException
onlyTime: Boolean? = false, if (dataSource !is DateRowEditableDescriptor) throw PokerAnalyticsException.DateTimePickerException
isClearable: Boolean? = true val calendar = Calendar.getInstance()
): DateTimePickerManager { calendar.time = dataSource.date ?: Date()
val calendar = Calendar.getInstance() val dateTimePickerManager = DateTimePickerManager()
calendar.time = date ?: Date() dateTimePickerManager.context = delegate.context
dateTimePickerManager.row = row
val dateTimePickerManager = DateTimePickerManager() dateTimePickerManager.delegate = delegate
dateTimePickerManager.context = context dateTimePickerManager.calendar = calendar
dateTimePickerManager.row = row dateTimePickerManager.minimumDate = dataSource.minimumDate
dateTimePickerManager.delegate = delegate dateTimePickerManager.onlyDate = dataSource.onlyDate
dateTimePickerManager.calendar = calendar dateTimePickerManager.onlyTime = dataSource.onlyTime
dateTimePickerManager.minimumDate = minimumDate dateTimePickerManager.isClearable = row.valueCanBeClearedWhenEditing
dateTimePickerManager.onlyDate = onlyDate ?: false
dateTimePickerManager.onlyTime = onlyTime ?: false if (dateTimePickerManager.onlyTime) {
dateTimePickerManager.isClearable = isClearable ?: true dateTimePickerManager.showTimePicker()
} else {
if (dateTimePickerManager.onlyTime) { dateTimePickerManager.showDatePicker()
dateTimePickerManager.showTimePicker() }
} else { }
dateTimePickerManager.showDatePicker() }
}
return dateTimePickerManager
}
}
override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) { override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
calendar.set(Calendar.YEAR, year) calendar.set(Calendar.YEAR, year)

@ -0,0 +1,93 @@
package net.pokeranalytics.android.ui.view
import io.realm.RealmResults
import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException
import net.pokeranalytics.android.util.UserDefaults
import java.util.*
import kotlin.collections.ArrayList
/**
* An container class to describe the way an field of an object will be edited
*/
enum class RowEditableDescriptorType {
DATE,
DATA,
STATIC,
DEFAULT
}
open class RowEditableDescriptor(var defaultValue: Any? = null,
var hint: Int? = null,
var inputType: Int? = null)
class DateRowEditableDescriptor(date: Date? = null,
val minimumDate: Date? = null,
var onlyDate: Boolean = false,
var onlyTime: Boolean = false): RowEditableDescriptor(defaultValue = date) {
val date: Date?
get() {
return defaultValue as Date?
}
}
class DataRowEditableDescriptor(
defaultValue: Any? = null,
hint: Int? = null,
inputType: Int? = null,
data: RealmResults<*>? = null): RowEditableDescriptor(defaultValue, hint, inputType) {
var data: RealmResults<RowRepresentable>? = null
init {
if (data != null && data.count() > 0) {
if (data.first() is RowRepresentable) {
this.data = data as RealmResults<RowRepresentable>?
}
}
}
}
class StaticDataRowEditableDescriptor(
defaultValue: Any? = null,
hint: Int? = null,
inputType: Int? = null,
var staticData: List<RowRepresentable>? = null): RowEditableDescriptor(defaultValue, hint, inputType) {
}
class RowEditableDataSource(customCurrency: Currency? = null) {
var currency: Currency = UserDefaults.currency
init {
customCurrency?.let { currency = it }
}
var descriptors = ArrayList<RowEditableDescriptor>()
fun append(defaultValue: Any? = null, hint: Int? = null, inputType: Int? = null, data: RealmResults<*>? = null, staticData: List<RowRepresentable>? = null) {
when {
data != null -> descriptors.add(DataRowEditableDescriptor(defaultValue, hint, inputType, data))
staticData != null -> descriptors.add(StaticDataRowEditableDescriptor(defaultValue, hint, inputType, staticData))
else -> descriptors.add(RowEditableDescriptor(defaultValue, hint, inputType))
}
}
fun appendDateDescriptor(date:Date?= null,
minimumDate: Date? = null,
onlyDate: Boolean = false,
onlyTime: Boolean = false) {
descriptors.add(DateRowEditableDescriptor(date, minimumDate, onlyDate, onlyTime))
}
val descriptorType: RowEditableDescriptorType
get() {
return when (descriptors.firstOrNull()) {
null -> throw RowRepresentableEditDescriptorException("RowEditableDescriptor inconsistency")
is DateRowEditableDescriptor -> RowEditableDescriptorType.DATE
is DataRowEditableDescriptor -> RowEditableDescriptorType.DATA
is StaticDataRowEditableDescriptor -> RowEditableDescriptorType.STATIC
else -> RowEditableDescriptorType.DEFAULT
}
}
}

@ -1,31 +1,26 @@
package net.pokeranalytics.android.ui.view package net.pokeranalytics.android.ui.view
import android.content.Context import android.content.Context
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
/** /**
* An interface extending Displayable to add a way to represent an object as a String * An interface extending Displayable to add a way to represent an object as a String
*/ */
interface RowRepresentable : Displayable, EditDataSource, ImageDecorator { interface RowRepresentable : Displayable, RowEditable, ImageDecorator {
fun getDisplayName(context: Context): String { fun getDisplayName(context: Context): String {
return NULL_TEXT return NULL_TEXT
} }
} }
interface EditDataSource { interface RowEditable {
fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? { fun startEditing(dataSource:Any?, parent:Fragment?) {}
return null
}
}
interface DefaultEditDataSource : EditDataSource, Localizable { val valueCanBeClearedWhenEditing: Boolean
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? { get() { return true }
val defaultValue: String? by map
return arrayListOf(RowRepresentableEditDescriptor(defaultValue, this.resId))
}
} }
/** /**
@ -62,9 +57,9 @@ interface Displayable : Localizable {
return null return null
} }
val bottomSheetType: BottomSheetType val inputFragmentType: InputFragmentType
get() { get() {
return BottomSheetType.NONE return InputFragmentType.NONE
} }
val selectedChoice: Int val selectedChoice: Int

@ -1,14 +0,0 @@
package net.pokeranalytics.android.ui.view
import io.realm.RealmResults
/**
* An container class to describe the way an field of an object will be edited
*/
class RowRepresentableEditDescriptor(
var defaultValue: Any? = null,
var hint: Int? = null,
var inputType: Int? = null,
var data: RealmResults<RowRepresentable>? = null,
var staticData: List<RowRepresentable>? = null
)

@ -1,15 +1,18 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import android.text.InputType import android.text.InputType
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.ui.view.DefaultEditDataSource import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.*
import java.util.*
enum class BankrollRow : RowRepresentable {
enum class BankrollRow : RowRepresentable, DefaultEditDataSource { NAME,
LIVE, LIVE,
INITIAL_VALUE, INITIAL_VALUE,
CURRENCY, CURRENCY,
@ -19,6 +22,7 @@ enum class BankrollRow : RowRepresentable, DefaultEditDataSource {
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {
NAME -> R.string.name
LIVE -> R.string.online LIVE -> R.string.online
INITIAL_VALUE -> R.string.initial_value INITIAL_VALUE -> R.string.initial_value
CURRENCY -> R.string.currency CURRENCY -> R.string.currency
@ -30,6 +34,7 @@ enum class BankrollRow : RowRepresentable, DefaultEditDataSource {
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
NAME -> RowViewType.TITLE_VALUE.ordinal
LIVE -> RowViewType.TITLE_SWITCH.ordinal LIVE -> RowViewType.TITLE_SWITCH.ordinal
INITIAL_VALUE -> RowViewType.TITLE_VALUE.ordinal INITIAL_VALUE -> RowViewType.TITLE_VALUE.ordinal
CURRENCY -> RowViewType.TITLE_VALUE_ARROW.ordinal CURRENCY -> RowViewType.TITLE_VALUE_ARROW.ordinal
@ -38,34 +43,32 @@ enum class BankrollRow : RowRepresentable, DefaultEditDataSource {
} }
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return when (this) { return when (this) {
LIVE -> BottomSheetType.NONE NAME -> InputFragmentType.EDIT_TEXT
INITIAL_VALUE -> BottomSheetType.NUMERIC_TEXT LIVE -> InputFragmentType.NONE
CURRENCY -> BottomSheetType.NONE INITIAL_VALUE -> InputFragmentType.NUMERIC_TEXT
RATE -> BottomSheetType.NUMERIC_TEXT CURRENCY -> InputFragmentType.NONE
REFRESH_RATE -> BottomSheetType.NONE RATE -> InputFragmentType.NUMERIC_TEXT
REFRESH_RATE -> InputFragmentType.NONE
} }
} }
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? { override fun startEditing(dataSource: Any?, parent: Fragment?) {
return when (this) { if (dataSource == null) return
INITIAL_VALUE -> { if (dataSource !is Bankroll) return
val defaultValue : Any? by map if (parent == null) return
arrayListOf( if (parent !is RowRepresentableDelegate) return
RowRepresentableEditDescriptor(defaultValue, R.string.initial_value, InputType.TYPE_CLASS_NUMBER
or InputType.TYPE_NUMBER_FLAG_DECIMAL) val bankrollCurrency: Currency? = dataSource.currency?.code?.let { Currency.getInstance(it) }
) val data = RowEditableDataSource(bankrollCurrency)
} when (this) {
RATE -> { NAME -> data.append(dataSource.name)
val defaultValue : Any? by map INITIAL_VALUE -> data.append(dataSource.initialValue, R.string.initial_value, InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL)
arrayListOf( RATE -> data.append(dataSource.currency?.rate, R.string.rate, InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL)
RowRepresentableEditDescriptor(defaultValue, R.string.rate, InputType.TYPE_CLASS_NUMBER else -> PokerAnalyticsException.InputFragmentException
or InputType.TYPE_NUMBER_FLAG_DECIMAL) }
) InputFragment.buildAndShow(this, parent, data)
} }
else -> super<RowRepresentable>.editingDescriptors(map)
}
}
} }

@ -1,19 +1,25 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.view.DefaultEditDataSource import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
enum class CustomFieldRow : RowRepresentable, DefaultEditDataSource { enum class CustomFieldRow : RowRepresentable {
NAME,
TYPE, TYPE,
COPY_ON_DUPLICATE; COPY_ON_DUPLICATE;
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {
NAME -> R.string.name
COPY_ON_DUPLICATE -> R.string.copy_on_duplicate COPY_ON_DUPLICATE -> R.string.copy_on_duplicate
else -> null else -> null
} }
@ -22,16 +28,18 @@ enum class CustomFieldRow : RowRepresentable, DefaultEditDataSource {
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
NAME -> RowViewType.TITLE_VALUE.ordinal
TYPE -> RowViewType.LIST.ordinal TYPE -> RowViewType.LIST.ordinal
COPY_ON_DUPLICATE -> RowViewType.TITLE_SWITCH.ordinal COPY_ON_DUPLICATE -> RowViewType.TITLE_SWITCH.ordinal
} }
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return when (this) { return when (this) {
TYPE -> BottomSheetType.NONE NAME -> InputFragmentType.EDIT_TEXT
COPY_ON_DUPLICATE -> BottomSheetType.NONE TYPE -> InputFragmentType.NONE
COPY_ON_DUPLICATE -> InputFragmentType.NONE
} }
} }
@ -55,4 +63,41 @@ enum class CustomFieldRow : RowRepresentable, DefaultEditDataSource {
} }
return list return list
} }
/*
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowEditableDescriptor>? {
return when (type) {
Type.LIST.uniqueIdentifier -> {
val defaultValue: Any? by map
val data: RealmList<CustomFieldEntry>? by map
arrayListOf(
RowEditableDescriptor(defaultValue, staticData = data)
)
}
else -> {
val defaultValue: Double? by map
arrayListOf(
RowEditableDescriptor(
defaultValue, inputType = InputType.TYPE_CLASS_NUMBER
or InputType.TYPE_NUMBER_FLAG_DECIMAL
or InputType.TYPE_NUMBER_FLAG_SIGNED
)
)
}
}
}
*/
override fun startEditing(dataSource: Any?, parent: Fragment?) {
if (dataSource == null) return
if (dataSource !is CustomField) return
if (parent == null) return
if (parent !is RowRepresentableDelegate) return
val data = RowEditableDataSource()
when (this) {
NAME -> data.append(dataSource.name)
else -> PokerAnalyticsException.InputFragmentException
}
InputFragment.buildAndShow(this, parent, data)
}
} }

@ -1,27 +1,37 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import android.text.InputType import android.text.InputType
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
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.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType
import java.util.*
interface FilterElementRow : RowRepresentable { interface FilterElementRow : RowRepresentable {
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? {
return when (this) { override fun startEditing(dataSource: Any?, parent: Fragment?) {
if (parent == null) return
if (parent !is RowRepresentableDelegate) return
val data = RowEditableDataSource()
when (this) {
is QueryCondition.DateQuery -> data.appendDateDescriptor(this.singleValue, onlyDate = !this.showTime, onlyTime = this.showTime)
is QueryCondition.Duration -> { is QueryCondition.Duration -> {
val hours: String? by map var hours: String? = null
val minutes: String? by map var minutes: String? = null
arrayListOf( this.minutes?.let {
RowRepresentableEditDescriptor(hours, R.string.hour, inputType = InputType.TYPE_CLASS_NUMBER), hours = if (it / 60 > 0) (it / 60).toString() else null
RowRepresentableEditDescriptor(minutes, R.string.minute, inputType = InputType.TYPE_CLASS_NUMBER) minutes = if (it % 60 > 0) (it % 60).toString() else null
) }
data.append(hours, R.string.hour, inputType = InputType.TYPE_CLASS_NUMBER)
data.append(minutes, R.string.minute, inputType = InputType.TYPE_CLASS_NUMBER)
} }
is QueryCondition.ListOfValues<*> -> { is QueryCondition.ListOfValues<*> -> {
val valueAsString: String? by map var valueAsString: String? = null
this.listOfValues.firstOrNull()?.let {
valueAsString = this.listOfValues.firstOrNull()?.toString()
}
val hint = when (this.operator) { val hint = when (this.operator) {
QueryCondition.Operator.MORE, QueryCondition.Operator.LESS -> { QueryCondition.Operator.MORE, QueryCondition.Operator.LESS -> {
when (this) { when (this) {
@ -32,13 +42,11 @@ interface FilterElementRow : RowRepresentable {
} }
else -> this.resId else -> this.resId
} }
data.append(valueAsString, hint, inputType = InputType.TYPE_CLASS_NUMBER)
arrayListOf(
RowRepresentableEditDescriptor(valueAsString, hint, inputType = InputType.TYPE_CLASS_NUMBER)
)
} }
else -> super.editingDescriptors(map)
} }
InputFragment.buildAndShow(this, parent, data)
} }
var filterSectionRow: FilterSectionRow var filterSectionRow: FilterSectionRow

@ -1,17 +1,23 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.model.realm.Game
import net.pokeranalytics.android.ui.view.DefaultEditDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
enum class GameRow : RowRepresentable, DefaultEditDataSource { enum class GameRow : RowRepresentable {
NAME,
SHORT_NAME; SHORT_NAME;
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {
NAME -> R.string.name
SHORT_NAME -> R.string.short_name SHORT_NAME -> R.string.short_name
} }
} }
@ -19,15 +25,30 @@ enum class GameRow : RowRepresentable, DefaultEditDataSource {
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
NAME -> RowViewType.TITLE_VALUE.ordinal
SHORT_NAME -> RowViewType.TITLE_VALUE.ordinal SHORT_NAME -> RowViewType.TITLE_VALUE.ordinal
} }
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return when (this) { return when (this) {
SHORT_NAME -> BottomSheetType.EDIT_TEXT NAME -> InputFragmentType.EDIT_TEXT
SHORT_NAME -> InputFragmentType.EDIT_TEXT
} }
} }
override fun startEditing(dataSource: Any?, parent: Fragment?) {
if (dataSource == null) return
if (dataSource !is Game) return
if (parent == null) return
if (parent !is RowRepresentableDelegate) return
val data = RowEditableDataSource()
when (this) {
NAME -> data.append(dataSource.name)
SHORT_NAME -> data.append(dataSource.shortName)
}
InputFragment.buildAndShow(this, parent, data)
}
} }

@ -1,19 +1,26 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.ui.view.DefaultEditDataSource import net.pokeranalytics.android.model.realm.Location
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
enum class LocationRow : RowRepresentable, DefaultEditDataSource { enum class LocationRow : RowRepresentable {
NAME,
LOCATION_PERMISSION_SWITCH, LOCATION_PERMISSION_SWITCH,
LOCATION_LOADER; LOCATION_LOADER;
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {
NAME -> R.string.name
LOCATION_PERMISSION_SWITCH -> R.string.geo_locate LOCATION_PERMISSION_SWITCH -> R.string.geo_locate
LOCATION_LOADER -> null LOCATION_LOADER -> null
} }
@ -22,17 +29,32 @@ enum class LocationRow : RowRepresentable, DefaultEditDataSource {
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
NAME -> RowViewType.TITLE_VALUE.ordinal
LOCATION_PERMISSION_SWITCH -> RowViewType.TITLE_SWITCH.ordinal LOCATION_PERMISSION_SWITCH -> RowViewType.TITLE_SWITCH.ordinal
LOCATION_LOADER -> RowViewType.LOADER.ordinal LOCATION_LOADER -> RowViewType.LOADER.ordinal
} }
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return when (this) { return when (this) {
LOCATION_PERMISSION_SWITCH -> BottomSheetType.NONE NAME -> InputFragmentType.EDIT_TEXT
LOCATION_LOADER -> BottomSheetType.NONE LOCATION_PERMISSION_SWITCH -> InputFragmentType.NONE
LOCATION_LOADER -> InputFragmentType.NONE
} }
} }
override fun startEditing(dataSource: Any?, parent: Fragment?) {
if (dataSource == null) return
if (dataSource !is Location) return
if (parent == null) return
if (parent !is RowRepresentableDelegate) return
val data = RowEditableDataSource()
when (this) {
NAME -> data.append(dataSource.name)
else -> PokerAnalyticsException.InputFragmentException
}
InputFragment.buildAndShow(this, parent, data)
}
} }

@ -1,315 +1,286 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import android.text.InputType import android.text.InputType
import io.realm.RealmResults import android.widget.Toast
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.extensions.SessionState 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.realm.Session import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
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.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.extensions.round import net.pokeranalytics.android.util.extensions.round
import net.pokeranalytics.android.util.extensions.sorted
import java.util.*
enum class SessionRow : RowRepresentable { enum class SessionRow : RowRepresentable {
PRIZE, PRIZE,
CASHED_OUT, CASHED_OUT,
NET_RESULT, NET_RESULT,
INITIAL_BUY_IN, INITIAL_BUY_IN,
BUY_IN, BUY_IN,
POSITION, POSITION,
PLAYERS, PLAYERS,
TIPS, TIPS,
GAME, GAME,
BLINDS, BLINDS,
LOCATION, LOCATION,
BANKROLL, BANKROLL,
TABLE_SIZE, TABLE_SIZE,
TOURNAMENT_TYPE, TOURNAMENT_TYPE,
TOURNAMENT_NAME, TOURNAMENT_NAME,
TOURNAMENT_FEATURE, TOURNAMENT_FEATURE,
START_DATE, START_DATE,
END_DATE, END_DATE,
BREAK_TIME, BREAK_TIME,
COMMENT; COMMENT;
companion object { companion object {
/** /**
* Return the rows to display for the current session state * Return the rows to display for the current session state
*/ */
fun getRows(session: Session): List<RowRepresentable> { fun getRows(session: Session): List<RowRepresentable> {
when (session.type) { when (session.type) {
Session.Type.TOURNAMENT.ordinal -> { Session.Type.TOURNAMENT.ordinal -> {
return when (session.getState()) { return when (session.getState()) {
SessionState.PENDING, SessionState.PLANNED -> { SessionState.PENDING, SessionState.PLANNED -> {
arrayListOf( arrayListOf(
GAME, GAME,
INITIAL_BUY_IN, INITIAL_BUY_IN,
LOCATION, LOCATION,
BANKROLL, BANKROLL,
TABLE_SIZE, TABLE_SIZE,
TOURNAMENT_TYPE, TOURNAMENT_TYPE,
TOURNAMENT_NAME, TOURNAMENT_NAME,
TOURNAMENT_FEATURE, TOURNAMENT_FEATURE,
START_DATE, START_DATE,
END_DATE END_DATE
) )
} }
SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> {
arrayListOf( arrayListOf(
PRIZE, PRIZE,
BUY_IN, BUY_IN,
POSITION, POSITION,
PLAYERS, PLAYERS,
TIPS, TIPS,
COMMENT, COMMENT,
SeparatorRow(), SeparatorRow(),
GAME, GAME,
INITIAL_BUY_IN, INITIAL_BUY_IN,
LOCATION, LOCATION,
BANKROLL, BANKROLL,
TABLE_SIZE, TABLE_SIZE,
TOURNAMENT_TYPE, TOURNAMENT_TYPE,
TOURNAMENT_NAME, TOURNAMENT_NAME,
TOURNAMENT_FEATURE, TOURNAMENT_FEATURE,
SeparatorRow(), SeparatorRow(),
START_DATE, START_DATE,
END_DATE, END_DATE,
BREAK_TIME BREAK_TIME
) )
} }
} }
} }
Session.Type.CASH_GAME.ordinal -> { Session.Type.CASH_GAME.ordinal -> {
when (session.getState()) { when (session.getState()) {
SessionState.PENDING, SessionState.PLANNED -> { SessionState.PENDING, SessionState.PLANNED -> {
return arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE) return arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE)
} }
SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> {
val fields = mutableListOf<RowRepresentable>() val fields = mutableListOf<RowRepresentable>()
when { when {
session.hasBuyin -> fields.addAll(listOf(CASHED_OUT, BUY_IN, TIPS)) session.hasBuyin -> fields.addAll(listOf(CASHED_OUT, BUY_IN, TIPS))
session.hasNetResult -> fields.add(NET_RESULT) session.hasNetResult -> fields.add(NET_RESULT)
session.isLive -> fields.addAll(listOf(CASHED_OUT, BUY_IN, TIPS)) session.isLive -> fields.addAll(listOf(CASHED_OUT, BUY_IN, TIPS))
else -> fields.add(NET_RESULT) else -> fields.add(NET_RESULT)
} }
fields.add(COMMENT) fields.add(COMMENT)
fields.add(SeparatorRow()) fields.add(SeparatorRow())
fields.addAll(listOf( fields.addAll(
GAME, listOf(
BLINDS, GAME,
LOCATION, BLINDS,
BANKROLL, LOCATION,
TABLE_SIZE, BANKROLL,
START_DATE, TABLE_SIZE,
END_DATE, START_DATE,
BREAK_TIME END_DATE,
BREAK_TIME
) )
) )
return fields return fields
} }
} }
} }
} }
return arrayListOf() return arrayListOf()
} }
} }
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {
NET_RESULT -> R.string.net_result NET_RESULT -> R.string.net_result
PRIZE -> R.string.prize PRIZE -> R.string.prize
POSITION -> R.string.position POSITION -> R.string.position
PLAYERS -> R.string.players PLAYERS -> R.string.players
CASHED_OUT -> R.string.cashed_out CASHED_OUT -> R.string.cashed_out
INITIAL_BUY_IN -> R.string.initial_stack INITIAL_BUY_IN -> R.string.initial_stack
BUY_IN -> R.string.buyin BUY_IN -> R.string.buyin
TIPS -> R.string.tips TIPS -> R.string.tips
GAME -> R.string.game GAME -> R.string.game
BLINDS -> R.string.blinds BLINDS -> R.string.blinds
LOCATION -> R.string.location LOCATION -> R.string.location
BANKROLL -> R.string.bankroll BANKROLL -> R.string.bankroll
TABLE_SIZE -> R.string.table_size TABLE_SIZE -> R.string.table_size
TOURNAMENT_TYPE -> R.string.tournament_type TOURNAMENT_TYPE -> R.string.tournament_type
TOURNAMENT_NAME -> R.string.tournament_name TOURNAMENT_NAME -> R.string.tournament_name
TOURNAMENT_FEATURE -> R.string.tournament_feature TOURNAMENT_FEATURE -> R.string.tournament_feature
START_DATE -> R.string.start_date START_DATE -> R.string.start_date
END_DATE -> R.string.end_date END_DATE -> R.string.end_date
BREAK_TIME -> R.string.break_time BREAK_TIME -> R.string.break_time
COMMENT -> R.string.comment COMMENT -> R.string.comment
} }
} }
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
NET_RESULT, PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS, NET_RESULT, PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT,
TOURNAMENT_TYPE, TOURNAMENT_NAME, TOURNAMENT_FEATURE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal TOURNAMENT_TYPE, TOURNAMENT_NAME, TOURNAMENT_FEATURE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal
} }
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return when (this) { return when (this) {
NET_RESULT, CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.NUMERIC_TEXT NET_RESULT, CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> InputFragmentType.NUMERIC_TEXT
BUY_IN, TIPS -> BottomSheetType.SUM BUY_IN, TIPS -> InputFragmentType.SUM
BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT BLINDS -> InputFragmentType.DOUBLE_EDIT_TEXT
GAME -> BottomSheetType.LIST_GAME GAME -> InputFragmentType.LIST_GAME
TOURNAMENT_TYPE -> BottomSheetType.LIST_STATIC TOURNAMENT_TYPE -> InputFragmentType.LIST_STATIC
LOCATION, BANKROLL, TOURNAMENT_NAME -> BottomSheetType.LIST LOCATION, BANKROLL, TOURNAMENT_NAME -> InputFragmentType.LIST
TOURNAMENT_FEATURE -> BottomSheetType.MULTI_SELECTION TOURNAMENT_FEATURE -> InputFragmentType.MULTI_SELECTION
TABLE_SIZE -> BottomSheetType.GRID TABLE_SIZE -> InputFragmentType.GRID
COMMENT -> BottomSheetType.EDIT_TEXT_MULTI_LINES COMMENT -> InputFragmentType.EDIT_TEXT_MULTI_LINES
else -> BottomSheetType.NONE else -> InputFragmentType.NONE
} }
} }
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? { override fun startEditing(dataSource: Any?, parent: Fragment?) {
return when (this) { if (dataSource == null) return
BLINDS -> { if (dataSource !is Session) return
val sb: String? by map if (parent == null) return
val bb: String? by map if (parent !is RowRepresentableDelegate) return
arrayListOf(
RowRepresentableEditDescriptor(
sb, R.string.smallblind, InputType.TYPE_CLASS_NUMBER
or InputType.TYPE_NUMBER_FLAG_DECIMAL
),
RowRepresentableEditDescriptor(
bb, R.string.bigblind, InputType.TYPE_CLASS_NUMBER
or InputType.TYPE_NUMBER_FLAG_DECIMAL
)
)
}
BUY_IN -> {
val bb: Double? by map
val fee: Double? by map
val ratedBuyin: Double? by map
val data = arrayListOf<RowRepresentableEditDescriptor>()
if (bb != null) {
data.add(RowRepresentableEditDescriptor(100.0 * (bb ?: 0.0)))
data.add(RowRepresentableEditDescriptor(200.0 * (bb ?: 0.0)))
} else if (fee != null) {
data.add(RowRepresentableEditDescriptor((fee ?: 0.0) * 1.0))
data.add(RowRepresentableEditDescriptor((fee ?: 0.0) * 2.0))
} else {
data.add(RowRepresentableEditDescriptor(0))
data.add(RowRepresentableEditDescriptor(0))
}
data.add(RowRepresentableEditDescriptor(ratedBuyin)) val session: Session = dataSource
data.add(
RowRepresentableEditDescriptor(
inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
)
)
data.add(
RowRepresentableEditDescriptor(
inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
)
)
data
}
CASHED_OUT, PRIZE, NET_RESULT -> {
val defaultValue: Double? by map
arrayListOf(
RowRepresentableEditDescriptor(
defaultValue,
inputType = InputType.TYPE_CLASS_NUMBER
or InputType.TYPE_NUMBER_FLAG_DECIMAL
or InputType.TYPE_NUMBER_FLAG_SIGNED
)
)
}
COMMENT -> {
val defaultValue: String? by map
arrayListOf(RowRepresentableEditDescriptor(defaultValue, R.string.comment))
}
BREAK_TIME -> {
arrayListOf(
RowRepresentableEditDescriptor(
hint = R.string.in_minutes, inputType = InputType.TYPE_CLASS_NUMBER
)
)
}
GAME -> {
val limit: Int? by map
val defaultValue: Any? by map
val data: RealmResults<RowRepresentable>? by map
arrayListOf(
RowRepresentableEditDescriptor(limit),
RowRepresentableEditDescriptor(defaultValue, data = data)
)
}
INITIAL_BUY_IN -> {
val defaultValue: Double? by map
arrayListOf(
RowRepresentableEditDescriptor(defaultValue?.round(), inputType = InputType.TYPE_CLASS_NUMBER)
)
}
BANKROLL, LOCATION, TOURNAMENT_FEATURE, TOURNAMENT_NAME -> {
val defaultValue: Any? by map
val data: RealmResults<RowRepresentable>? by map
arrayListOf(
RowRepresentableEditDescriptor(defaultValue, data = data)
)
}
PLAYERS -> {
val defaultValue: Int? by map
arrayListOf(
RowRepresentableEditDescriptor(
defaultValue?.toString(),
inputType = InputType.TYPE_CLASS_NUMBER
)
)
}
POSITION -> {
val defaultValue: Int? by map
arrayListOf(
RowRepresentableEditDescriptor(
defaultValue,
inputType = InputType.TYPE_CLASS_NUMBER
)
)
}
TABLE_SIZE -> {
val defaultValue: Int? by map
arrayListOf(RowRepresentableEditDescriptor(defaultValue))
}
TIPS -> {
val sb: String? by map
val bb: String? by map
val tips: Double? by map
// Disable the buttons with value = 0, add current value & set the 2 edit texts val data = RowEditableDataSource(session.currency)
arrayListOf( when (this) {
RowRepresentableEditDescriptor(sb ?: 0.0), START_DATE -> {
RowRepresentableEditDescriptor(bb ?: 0.0), data.appendDateDescriptor(session.startDate)
RowRepresentableEditDescriptor(tips ?: 0.0), }
RowRepresentableEditDescriptor("", inputType = InputType.TYPE_CLASS_NUMBER), END_DATE -> {
RowRepresentableEditDescriptor("", inputType = InputType.TYPE_CLASS_NUMBER) if (session.startDate == null) {
) Toast.makeText(parent.context, R.string.session_missing_start_date, Toast.LENGTH_SHORT).show()
} return
TOURNAMENT_TYPE -> { } else {
val defaultValue: Any? by map data.appendDateDescriptor(session.endDate ?: session.startDate ?: Date(), session.startDate)
arrayListOf( }
RowRepresentableEditDescriptor(defaultValue, staticData = TournamentType.values().map { }
it
})
)
}
else -> null
}
}
BANKROLL -> data.append(session.bankroll, data = session.realm.sorted<Bankroll>())
CASHED_OUT, PRIZE -> data.append(
session.result?.cashout,
inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL or InputType.TYPE_NUMBER_FLAG_SIGNED
)
NET_RESULT -> data.append(
session.result?.netResult,
inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL or InputType.TYPE_NUMBER_FLAG_SIGNED
)
INITIAL_BUY_IN -> data.append(session.tournamentEntryFee?.round(), inputType = InputType.TYPE_CLASS_NUMBER)
BUY_IN -> {
val bb: Double? = session.cgBigBlind
val fee: Double? = session.tournamentEntryFee
val ratedBuyin: Double? = session.result?.buyin
if (bb != null) {
data.append(100.0 * bb)
data.append(200.0 * bb)
} else if (fee != null) {
data.append(fee)
data.append(fee * 2.0)
} else {
data.append(0)
data.append(0)
}
data.append(ratedBuyin)
data.append(inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL)
data.append(inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL)
}
POSITION -> data.append(session.result?.tournamentFinalPosition, inputType = InputType.TYPE_CLASS_NUMBER)
PLAYERS -> data.append(
session.tournamentNumberOfPlayers.toString(),
inputType = InputType.TYPE_CLASS_NUMBER
)
TIPS -> {
val sb: String? = session.cgSmallBlind?.round()
val bb: String? = session.cgBigBlind?.round()
val tips: Double? = session.result?.tips
data.append(sb ?: 0.0)
data.append(bb ?: 0.0)
data.append(tips ?: 0.0)
data.append("", inputType = InputType.TYPE_CLASS_NUMBER)
data.append("", inputType = InputType.TYPE_CLASS_NUMBER)
}
GAME -> {
data.append(session.limit)
data.append(session.game, data = session.realm.sorted<Game>())
}
BLINDS -> {
data.append(
session.cgSmallBlind?.round(),
R.string.smallblind,
InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
)
data.append(
session.cgBigBlind?.round(),
R.string.bigblind,
InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
)
}
LOCATION -> data.append(session.location, data = session.realm.sorted<Location>())
TABLE_SIZE -> data.append(session.tableSize)
TOURNAMENT_TYPE -> data.append(session.tournamentType, staticData = TournamentType.values().map { it })
TOURNAMENT_NAME -> data.append(session.tournamentName, data = session.realm.sorted<TournamentName>())
TOURNAMENT_FEATURE -> data.append(
session.tournamentFeatures,
data = session.realm.sorted<TournamentFeature>()
)
BREAK_TIME -> data.append(hint = R.string.in_minutes, inputType = InputType.TYPE_CLASS_NUMBER)
COMMENT -> data.append(session.comment, R.string.comment)
}
InputFragment.buildAndShow(this, parent, data)
}
override val valueCanBeClearedWhenEditing: Boolean
get() {
return when (this) {
BANKROLL -> false
else -> true
}
}
} }

@ -1,16 +1,15 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.DefaultEditDataSource
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
enum class SimpleRow : RowRepresentable, DefaultEditDataSource { enum class SimpleRow : RowRepresentable {
NAME; NAME;
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 inputFragmentType: InputFragmentType = InputFragmentType.EDIT_TEXT
} }

@ -1,6 +1,49 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import net.pokeranalytics.android.ui.view.DefaultEditDataSource import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.TournamentFeature
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType
enum class TournamentFeatureRow : RowRepresentable, DefaultEditDataSource enum class TournamentFeatureRow : RowRepresentable {
NAME;
override val resId: Int?
get() {
return when (this) {
NAME -> R.string.name
}
}
override val viewType: Int
get() {
return when (this) {
NAME -> RowViewType.TITLE_VALUE.ordinal
}
}
override val inputFragmentType: InputFragmentType
get() {
return when (this) {
NAME -> InputFragmentType.EDIT_TEXT
}
}
override fun startEditing(dataSource: Any?, parent: Fragment?) {
if (dataSource == null) return
if (dataSource !is TournamentFeature) return
if (parent == null) return
if (parent !is RowRepresentableDelegate) return
val data = RowEditableDataSource()
when (this) {
NAME -> data.append(dataSource.name)
}
InputFragment.buildAndShow(this, parent, data)
}
}

@ -1,6 +1,49 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import net.pokeranalytics.android.ui.view.DefaultEditDataSource import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.TournamentName
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType
enum class TournamentNameRow : RowRepresentable, DefaultEditDataSource enum class TournamentNameRow : RowRepresentable {
NAME;
override val resId: Int?
get() {
return when (this) {
NAME -> R.string.name
}
}
override val viewType: Int
get() {
return when (this) {
NAME -> RowViewType.TITLE_VALUE.ordinal
}
}
override val inputFragmentType: InputFragmentType
get() {
return when (this) {
NAME -> InputFragmentType.EDIT_TEXT
}
}
override fun startEditing(dataSource: Any?, parent: Fragment?) {
if (dataSource == null) return
if (dataSource !is TournamentName) return
if (parent == null) return
if (parent !is RowRepresentableDelegate) return
val data = RowEditableDataSource()
when (this) {
NAME -> data.append(dataSource.name)
}
InputFragment.buildAndShow(this, parent, data)
}
}

@ -1,16 +1,21 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import android.text.InputType import android.text.InputType
import io.realm.RealmResults import androidx.fragment.app.Fragment
import io.realm.Realm
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.ui.view.DefaultEditDataSource import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.model.realm.TransactionType
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.adapter.RowEditableDelegate
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.*
import net.pokeranalytics.android.util.extensions.round
import net.pokeranalytics.android.util.extensions.sorted
enum class TransactionRow : RowRepresentable, DefaultEditDataSource { enum class TransactionRow : RowRepresentable {
BANKROLL, BANKROLL,
TYPE, TYPE,
AMOUNT, AMOUNT,
@ -39,48 +44,50 @@ enum class TransactionRow : RowRepresentable, DefaultEditDataSource {
} }
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return when (this) { return when (this) {
BANKROLL -> BottomSheetType.LIST BANKROLL -> InputFragmentType.LIST
TYPE -> BottomSheetType.LIST TYPE -> InputFragmentType.LIST
AMOUNT -> BottomSheetType.EDIT_TEXT AMOUNT -> InputFragmentType.EDIT_TEXT
COMMENT -> BottomSheetType.EDIT_TEXT_MULTI_LINES COMMENT -> InputFragmentType.EDIT_TEXT_MULTI_LINES
DATE -> BottomSheetType.NONE DATE -> InputFragmentType.NONE
} }
} }
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? { override val valueCanBeClearedWhenEditing: Boolean
return when (this) { get() {
BANKROLL -> { return when (this) {
val defaultValue : Any? by map DATE -> false
val data : RealmResults<RowRepresentable>? by map else -> true
arrayListOf( }
RowRepresentableEditDescriptor(defaultValue, data = data) }
)
} override fun startEditing(dataSource: Any?, parent: Fragment?) {
TYPE -> { if (dataSource == null) return
val defaultValue : Any? by map if (dataSource !is Transaction) return
val data : RealmResults<RowRepresentable>? by map if (parent == null) return
arrayListOf( if (parent !is RowEditableDelegate) return
RowRepresentableEditDescriptor(defaultValue, data = data) val data = RowEditableDataSource()
) val realm = dataSource.realm?.let { it } ?: run { Realm.getDefaultInstance() }
} when (this) {
AMOUNT -> { DATE -> {
val defaultValue: String? by map data.appendDateDescriptor(dataSource.date, onlyDate = true)
arrayListOf( }
RowRepresentableEditDescriptor( BANKROLL -> data.append(
defaultValue, dataSource.bankroll,
inputType = InputType.TYPE_CLASS_NUMBER data = realm.sorted<Bankroll>()
or InputType.TYPE_NUMBER_FLAG_DECIMAL )
or InputType.TYPE_NUMBER_FLAG_SIGNED TYPE -> data.append(
)) dataSource.type,
} data = realm.sorted<TransactionType>()
COMMENT -> { )
val defaultValue : String? by map AMOUNT -> data.append(
arrayListOf(RowRepresentableEditDescriptor(defaultValue, R.string.comment)) (if (dataSource.amount != 0.0) dataSource.amount.round() else ""),
} inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL or InputType.TYPE_NUMBER_FLAG_SIGNED
else -> super<RowRepresentable>.editingDescriptors(map) )
} COMMENT -> data.append(dataSource.comment, R.string.comment)
} }
InputFragment.buildAndShow(this, parent, data)
}
} }

@ -1,17 +1,24 @@
package net.pokeranalytics.android.ui.view.rowrepresentable package net.pokeranalytics.android.ui.view.rowrepresentable
import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.ui.view.DefaultEditDataSource import net.pokeranalytics.android.model.realm.TransactionType
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.input.InputFragment
import net.pokeranalytics.android.ui.fragment.components.input.InputFragmentType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowEditableDataSource
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
enum class TransactionTypeRow : RowRepresentable, DefaultEditDataSource { enum class TransactionTypeRow : RowRepresentable {
NAME,
TRANSACTION_ADDITIVE; TRANSACTION_ADDITIVE;
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {
NAME -> R.string.name
TRANSACTION_ADDITIVE -> R.string.additive TRANSACTION_ADDITIVE -> R.string.additive
} }
} }
@ -19,17 +26,32 @@ enum class TransactionTypeRow : RowRepresentable, DefaultEditDataSource {
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
NAME -> RowViewType.TITLE_VALUE.ordinal
TRANSACTION_ADDITIVE -> RowViewType.TITLE_SWITCH.ordinal TRANSACTION_ADDITIVE -> RowViewType.TITLE_SWITCH.ordinal
} }
} }
override val bottomSheetType: BottomSheetType override val inputFragmentType: InputFragmentType
get() { get() {
return when (this) { return when (this) {
TRANSACTION_ADDITIVE -> BottomSheetType.NONE NAME -> InputFragmentType.EDIT_TEXT
TRANSACTION_ADDITIVE -> InputFragmentType.NONE
} }
} }
override fun startEditing(dataSource: Any?, parent: Fragment?) {
if (dataSource == null) return
if (dataSource !is TransactionType) return
if (parent == null) return
if (parent !is RowRepresentableDelegate) return
val data = RowEditableDataSource()
when (this) {
NAME -> data.append(dataSource.name)
else -> PokerAnalyticsException.InputFragmentException
}
InputFragment.buildAndShow(this, parent, data)
}
} }

@ -1,36 +0,0 @@
package net.pokeranalytics.android.util
import android.content.Context
import java.util.*
class LocaleUtils {
companion object {
/**
* Return the current locale
*/
fun getCurrentLocale(context: Context) : Locale {
val defaultLocaleCode = Preferences.getString(Preferences.Keys.LOCALE_CODE, context)
var locale = Locale.getDefault()
if (defaultLocaleCode != null) {
locale = Locale(defaultLocaleCode)
Locale.setDefault(locale)
}
return locale
}
/**
*
*/
fun setCurrentLocale(context: Context, language: String) {
Preferences.setString(Preferences.Keys.LOCALE_CODE, language, context)
}
}
}

@ -38,7 +38,7 @@ class LocationManager(private var context: Context) {
// Use fields to define the data types to return. // Use fields to define the data types to return.
val placeFields = Arrays.asList(Place.Field.NAME, Place.Field.ADDRESS, Place.Field.LAT_LNG) val placeFields = Arrays.asList(Place.Field.NAME, Place.Field.ADDRESS, Place.Field.LAT_LNG)
// Use the builder to create a FindCurrentPlaceRequest. // Use the builder to buildAndShow a FindCurrentPlaceRequest.
val request = FindCurrentPlaceRequest.builder(placeFields).build() val request = FindCurrentPlaceRequest.builder(placeFields).build()
// Call findCurrentPlace and handle the response (first check that the user has granted permission). // Call findCurrentPlace and handle the response (first check that the user has granted permission).

Loading…
Cancel
Save