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

@ -18,6 +18,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
open class DeletableItemFragment : RealmFragment() { open class DeletableItemFragment : RealmFragment() {
private var deletedItem: RealmObject? = null private var deletedItem: RealmObject? = null
private var itemHasBeenReInserted: Boolean = false
private var lastDeletedItemPosition: Int = 0 private var lastDeletedItemPosition: Int = 0
private var dataListAdapter: RowRepresentableAdapter? = null private var dataListAdapter: RowRepresentableAdapter? = null
private var coordinatorLayout: CoordinatorLayout? = null private var coordinatorLayout: CoordinatorLayout? = null
@ -63,6 +64,7 @@ open class DeletableItemFragment : RealmFragment() {
getRealm().executeTransaction { getRealm().executeTransaction {
itemToDelete.deleteFromRealm() itemToDelete.deleteFromRealm()
} }
itemHasBeenReInserted = false
updateUIAfterDeletion(itemPosition) updateUIAfterDeletion(itemPosition)
showUndoSnackBar() showUndoSnackBar()
} else { } else {
@ -85,10 +87,13 @@ open class DeletableItemFragment : RealmFragment() {
this.coordinatorLayout?.let { view -> this.coordinatorLayout?.let { view ->
snackBar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE) snackBar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE)
snackBar?.setAction(R.string.cancel) { snackBar?.setAction(R.string.cancel) {
getRealm().executeTransaction { realm -> if (!itemHasBeenReInserted) {
deletedItem?.let { itemHasBeenReInserted = true
val item = realm.copyToRealmOrUpdate(it) getRealm().executeTransaction { realm ->
updateUIAfterUndoDeletion(item) 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 kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException 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.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
@ -36,7 +35,7 @@ class BottomSheetStaticListFragment : BottomSheetFragment(), StaticRowRepresenta
} }
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { 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() dismiss()
super.onRowSelected(position, row, fromAction) super.onRowSelected(position, row, fromAction)
} }

Loading…
Cancel
Save