Add custom fields for Session

dev
Aurelien Hubert 7 years ago
parent 386a5bab37
commit 2554eddb62
  1. 219
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  2. 13
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt
  3. 3
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt

@ -39,6 +39,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow
import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.UserDefaults
import net.pokeranalytics.android.util.extensions.*
import timber.log.Timber
import java.text.DateFormat
import java.util.*
import java.util.Currency
@ -67,34 +68,34 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
return realm.copyToRealm(session)
}
fun fieldNameForQueryType(queryCondition: Class < out QueryCondition >): String? {
return when (queryCondition) {
fun fieldNameForQueryType(queryCondition: Class<out QueryCondition>): String? {
return when (queryCondition) {
IsLive::class.java, IsOnline::class.java -> "bankroll.live"
IsCash::class.java, IsTournament::class.java -> "type"
AnyBankroll::class.java -> "bankroll.id"
AnyGame::class.java -> "game.id"
AnyTournamentName::class.java -> "tournamentName.id"
AnyTournamentFeature::class.java, AllTournamentFeature::class.java -> "tournamentFeatures.id"
AnyLocation::class.java -> "location.id"
AnyLimit::class.java -> "limit"
AnyTableSize::class.java -> "tableSize"
AnyTournamentType::class.java -> "tournamentType"
AnyBlind::class.java -> "blinds"
NumberOfTable::class.java -> "numberOfTable"
NetAmountWon::class.java, NetAmountLost::class.java -> "computableResults.ratedNet"
NumberOfRebuy::class.java -> "result.numberOfRebuy"
TournamentNumberOfPlayer::class.java -> "result.tournamentNumberOfPlayers"
TournamentFinalPosition::class.java -> "result.tournamentFinalPosition"
TournamentFee::class.java -> "tournamentEntryFee"
StartedFromDate::class.java, StartedToDate::class.java -> "startDate"
EndedFromDate::class.java, EndedToDate::class.java -> "endDate"
AnyDayOfWeek::class.java, IsWeekEnd::class.java, IsWeekDay::class.java -> "dayOfWeek"
AnyMonthOfYear::class.java -> "month"
AnyYear::class.java -> "year"
AnyGame::class.java -> "game.id"
AnyTournamentName::class.java -> "tournamentName.id"
AnyTournamentFeature::class.java, AllTournamentFeature::class.java -> "tournamentFeatures.id"
AnyLocation::class.java -> "location.id"
AnyLimit::class.java -> "limit"
AnyTableSize::class.java -> "tableSize"
AnyTournamentType::class.java -> "tournamentType"
AnyBlind::class.java -> "blinds"
NumberOfTable::class.java -> "numberOfTable"
NetAmountWon::class.java, NetAmountLost::class.java -> "computableResults.ratedNet"
NumberOfRebuy::class.java -> "result.numberOfRebuy"
TournamentNumberOfPlayer::class.java -> "result.tournamentNumberOfPlayers"
TournamentFinalPosition::class.java -> "result.tournamentFinalPosition"
TournamentFee::class.java -> "tournamentEntryFee"
StartedFromDate::class.java, StartedToDate::class.java -> "startDate"
EndedFromDate::class.java, EndedToDate::class.java -> "endDate"
AnyDayOfWeek::class.java, IsWeekEnd::class.java, IsWeekDay::class.java -> "dayOfWeek"
AnyMonthOfYear::class.java -> "month"
AnyYear::class.java -> "year"
IsToday::class.java, WasYesterday::class.java, WasTodayAndYesterday::class.java, DuringThisYear::class.java, DuringThisMonth::class.java, DuringThisWeek::class.java -> "startDate"
StartedFromTime::class.java -> "startDateHourMinuteComponent"
EndedToTime::class.java -> "endDateHourMinuteComponent"
Duration::class.java -> "netDuration"
StartedFromTime::class.java -> "startDateHourMinuteComponent"
EndedToTime::class.java -> "endDateHourMinuteComponent"
Duration::class.java -> "netDuration"
else -> null
}
}
@ -125,25 +126,25 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
override var year: Int? = null
override var dayOfMonth: Int? = null
private var startDateHourMinuteComponent: Double? = null
get() {
if (field == null && startDate != null) {
val cal = Calendar.getInstance()
cal.time = startDate
field = cal.hourMinute()
}
return field
}
private var endDateHourMinuteComponent: Double? = null
get() {
if (field == null && endDate != null) {
val cal = Calendar.getInstance()
cal.time = endDate
field = cal.hourMinute()
}
return field
}
private var startDateHourMinuteComponent: Double? = null
get() {
if (field == null && startDate != null) {
val cal = Calendar.getInstance()
cal.time = startDate
field = cal.hourMinute()
}
return field
}
private var endDateHourMinuteComponent: Double? = null
get() {
if (field == null && endDate != null) {
val cal = Calendar.getInstance()
cal.time = endDate
field = cal.hourMinute()
}
return field
}
/**
* The start date of the session
@ -151,13 +152,13 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
var startDate: Date? = null
set(value) {
field = value
if (field == null) {
startDateHourMinuteComponent = null
} else {
val cal = Calendar.getInstance()
cal.time = field
startDateHourMinuteComponent = cal.hourMinute()
}
if (field == null) {
startDateHourMinuteComponent = null
} else {
val cal = Calendar.getInstance()
cal.time = field
startDateHourMinuteComponent = cal.hourMinute()
}
this.updateTimeParameter(field)
this.computeNetDuration()
@ -176,15 +177,15 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
var endDate: Date? = null
set(value) {
field = value
if (field == null) {
endDateHourMinuteComponent = null
} else {
val cal = Calendar.getInstance()
cal.time = field
endDateHourMinuteComponent = cal.hourMinute()
}
this.computeNetDuration()
if (field == null) {
endDateHourMinuteComponent = null
} else {
val cal = Calendar.getInstance()
cal.time = field
endDateHourMinuteComponent = cal.hourMinute()
}
this.computeNetDuration()
this.dateChanged()
this.defineDefaultTournamentBuyinIfNecessary()
this.computeStats()
@ -266,7 +267,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
field = value
this.computeStats()
formatBlinds()
this.result?.computeNumberOfRebuy()
this.result?.computeNumberOfRebuy()
}
var blinds: String? = null
@ -276,10 +277,10 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
// The entry fee of the tournament
var tournamentEntryFee: Double? = null
set(value) {
field = value
this.result?.computeNumberOfRebuy()
}
set(value) {
field = value
this.result?.computeNumberOfRebuy()
}
// The total number of players who participated in the tournament
var tournamentNumberOfPlayers: Int? = null
@ -293,6 +294,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
// The features of the tournament, like Knockout, Shootout, Turbo...
var tournamentFeatures: RealmList<TournamentFeature> = RealmList()
// The custom fields values
var customFieldEntries: RealmList<CustomFieldEntry> = RealmList()
fun bankrollHasBeenUpdated() {
formatBlinds()
}
@ -574,7 +578,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
return blinds ?: NULL_TEXT
}
fun formatBlinds() {
fun formatBlinds() {
blinds = null
if (cgBigBlind == null) return
cgBigBlind?.let { bb ->
@ -589,9 +593,11 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
* Delete the object from realm
*/
fun delete() {
realm.executeTransaction {
cleanup()
deleteFromRealm()
if (isValid) {
realm.executeTransaction {
cleanup()
deleteFromRealm()
}
}
}
@ -613,6 +619,16 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
@Ignore
override val viewType: Int = RowViewType.ROW_SESSION.ordinal
// Override to surcharge custom field viewType
override fun viewTypeForPosition(position: Int): Int {
rowRepresentationForCurrentState[position].let {
if (it is CustomField) {
return RowViewType.TITLE_VALUE.ordinal
}
}
return super.viewTypeForPosition(position)
}
override fun getDisplayName(context: Context): String {
return "Session ${this.creationDate}"
}
@ -678,6 +694,13 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
// Rows
rows.addAll(SessionRow.getRows(this))
// Add custom fields
realm?.let {
rows.add(SeparatorRow())
rows.addAll(LiveData.CUSTOM_FIELD.itemsArray(it) as ArrayList<RowRepresentable>)
}
return rows
}
@ -711,10 +734,12 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
SessionRow.START_DATE -> this.startDate?.shortDateTime() ?: NULL_TEXT
SessionRow.TABLE_SIZE -> this.tableSize?.let { TableSize(it).localizedTitle(context) } ?: NULL_TEXT
SessionRow.TIPS -> result?.tips?.toCurrency(currency) ?: NULL_TEXT
SessionRow.TOURNAMENT_TYPE -> this.tournamentType?.let {
TournamentType.values()[it].localizedTitle(context)
} ?: run {
NULL_TEXT
SessionRow.TOURNAMENT_TYPE -> {
this.tournamentType?.let {
TournamentType.values()[it].localizedTitle(context)
} ?: run {
NULL_TEXT
}
}
SessionRow.TOURNAMENT_FEATURE -> {
if (tournamentFeatures.size > 2) {
@ -730,6 +755,12 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
}
}
SessionRow.TOURNAMENT_NAME -> tournamentName?.name ?: NULL_TEXT
is CustomField -> {
customFieldEntries.find { it.customField?.id == row.id }?.let { customFieldEntry ->
return customFieldEntry.getFormattedValue(currency)
}
return NULL_TEXT
}
else -> throw UnmanagedRowRepresentableException("Unmanaged row = ${row}")
}
}
@ -837,6 +868,19 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
"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 }?.value
)
}
)
}
else -> null
}
}
@ -946,7 +990,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
result = localResult
}
SessionRow.TOURNAMENT_NAME -> tournamentName = value as TournamentName?
SessionRow.TOURNAMENT_TYPE -> tournamentType = value as Int?
SessionRow.TOURNAMENT_TYPE -> tournamentType = (value as TournamentType?)?.ordinal
SessionRow.TOURNAMENT_FEATURE -> {
value?.let {
@ -956,6 +1000,33 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
tournamentFeatures.removeAll(this.tournamentFeatures)
}
}
is CustomField -> {
customFieldEntries.filter { it.customField?.id == row.id }.let {
customFieldEntries.removeAll(it)
}
when (row.type) {
CustomField.Type.AMOUNT.uniqueIdentifier,
CustomField.Type.NUMBER.uniqueIdentifier -> {
Timber.d("AMOUNT or NUMBER: ${value}")
if (value != null) {
val customFieldEntry = CustomFieldEntry()
customFieldEntry.customField = row
customFieldEntry.value = value.toString()
Timber.d("customFieldEntry: ${customFieldEntry.id}")
Timber.d("customFieldEntry: ${customFieldEntry.customField}")
Timber.d("customFieldEntry: ${customFieldEntry.value}")
customFieldEntries.add(customFieldEntry)
}
Timber.d("customFieldEntries: ${customFieldEntries.size}")
}
CustomField.Type.LIST.uniqueIdentifier -> {
if (value != null && value is CustomFieldEntry) {
customFieldEntries.add(value)
}
}
}
}
}
}
@ -1013,7 +1084,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
style: GraphFragment.Style,
groupName: String,
context: Context
) : LegendContent {
): LegendContent {
when (style) {
GraphFragment.Style.MULTILINE -> {

@ -18,6 +18,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
open class DeletableItemFragment : RealmFragment() {
private var deletedItem: RealmObject? = null
private var itemHasBeenReInserted: Boolean = false
private var lastDeletedItemPosition: Int = 0
private var dataListAdapter: RowRepresentableAdapter? = null
private var coordinatorLayout: CoordinatorLayout? = null
@ -63,6 +64,7 @@ open class DeletableItemFragment : RealmFragment() {
getRealm().executeTransaction {
itemToDelete.deleteFromRealm()
}
itemHasBeenReInserted = false
updateUIAfterDeletion(itemPosition)
showUndoSnackBar()
} else {
@ -85,10 +87,13 @@ open class DeletableItemFragment : RealmFragment() {
this.coordinatorLayout?.let { view ->
snackBar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE)
snackBar?.setAction(R.string.cancel) {
getRealm().executeTransaction { realm ->
deletedItem?.let {
val item = realm.copyToRealmOrUpdate(it)
updateUIAfterUndoDeletion(item)
if (!itemHasBeenReInserted) {
itemHasBeenReInserted = true
getRealm().executeTransaction { realm ->
deletedItem?.let {
val item = realm.copyToRealmOrUpdate(it)
updateUIAfterUndoDeletion(item)
}
}
}
}

@ -8,7 +8,6 @@ import kotlinx.android.synthetic.main.bottom_sheet_list.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException
import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
@ -36,7 +35,7 @@ class BottomSheetStaticListFragment : BottomSheetFragment(), StaticRowRepresenta
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
this.delegate.onRowValueChanged((row as TournamentType).ordinal, this.row)
this.delegate.onRowValueChanged(row, this.row)
dismiss()
super.onRowSelected(position, row, fromAction)
}

Loading…
Cancel
Save