diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 2f478421..8ec3a204 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -40,6 +40,12 @@ class PokerAnalyticsApplication : Application() { .build() Realm.setDefaultConfiguration(realmConfiguration) +// val realm = Realm.getDefaultInstance() +// realm.executeTransaction { +// realm.where(Session::class.java).findAll().deleteAllFromRealm() +// } +// realm.close() + // Set up Crashlytics, disabled for debug builds val crashlyticsKit = Crashlytics.Builder() .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) diff --git a/app/src/main/java/net/pokeranalytics/android/api/CurrencyConverterApi.kt b/app/src/main/java/net/pokeranalytics/android/api/CurrencyConverterApi.kt index 8d84d753..888a4a63 100644 --- a/app/src/main/java/net/pokeranalytics/android/api/CurrencyConverterApi.kt +++ b/app/src/main/java/net/pokeranalytics/android/api/CurrencyConverterApi.kt @@ -16,7 +16,7 @@ import retrofit2.http.Query import java.util.concurrent.TimeUnit /** - * Currency Converter API + * CurrencyCode Converter API */ interface CurrencyConverterApi { diff --git a/app/src/main/java/net/pokeranalytics/android/model/Limit.kt b/app/src/main/java/net/pokeranalytics/android/model/Limit.kt index 4eb28451..ca04d3e4 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/Limit.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/Limit.kt @@ -16,7 +16,7 @@ enum class Limit : RowRepresentable { return when (value) { "No Limit" -> NO "Pot Limit" -> POT - "Fixed Limit" -> FIXED + "Fixed Limit", "Limit" -> FIXED "Mixed Limit" -> MIXED "Spread Limit" -> SPREAD else -> null diff --git a/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt b/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt index 91d6f499..2b3c69b4 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/TableSize.kt @@ -6,21 +6,32 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType class TableSize(var numberOfPlayer: Int, var rowViewType: Int = RowViewType.TITLE_GRID.ordinal) : RowRepresentable { + companion object { - val all : List - get() { - return Array(9, init = - { index -> TableSize(index + 2) }).toList() - } + + val all: List + get() { + return Array(9, init = + { index -> TableSize(index + 2) }).toList() + } + + fun valueForLabel(label: String) : Int? { + return when (label) { + "Full Ring", "Full-Ring" -> 10 + "Short-Handed", "Short Handed" -> 6 + "Heads-Up", "Heads Up" -> 2 + else -> null + } + } } - override fun getDisplayName(context: Context): String { - return if (this.numberOfPlayer == 2) { - return "HU" - } else { - "${this.numberOfPlayer}-max" - } - } + override fun getDisplayName(context: Context): String { + return if (this.numberOfPlayer == 2) { + return "HU" + } else { + "${this.numberOfPlayer}-max" + } + } override val resId: Int? get() { diff --git a/app/src/main/java/net/pokeranalytics/android/model/TournamentType.kt b/app/src/main/java/net/pokeranalytics/android/model/TournamentType.kt index 4d6b2ebe..c17b647a 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/TournamentType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/TournamentType.kt @@ -14,6 +14,14 @@ enum class TournamentType : RowRepresentable { get() { return TournamentType.values() as List } + + fun getValueForLabel(label: String) : TournamentType? { + return when (label) { + "Single-Table" -> SNG + "Multi-Table" -> MTT + else -> null + } + } } override val resId: Int? diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index 2f54f7d9..3a7ef8bc 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -96,4 +96,25 @@ open class Bankroll : RealmObject(), NameManageable, RowRepresentable { else -> super.getFailedSaveMessage(status) } } + + companion object { + + fun getOrCreate(realm: Realm, name: String, live: Boolean = true, currencyCode: String? = null, currencyRate: Double? = null) : Bankroll { + + val bankroll = realm.where().equalTo("name", name).findFirst() + return if (bankroll != null) { + bankroll + } else { + val bankroll = Bankroll() + bankroll.name = name + val currency = Currency() + currency.code = currencyCode + currency.rate = currencyRate + bankroll.currency = currency + realm.copyToRealm(bankroll) + } + } + + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index a8636a63..7749e651 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -50,7 +50,20 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat enum class Type { CASH_GAME, - TOURNAMENT + TOURNAMENT; + + companion object { + + fun getValueFromString(string: String): Type? { + return when (string) { + "Cash", "Cash Game" -> CASH_GAME + "Tournament" -> TOURNAMENT + else -> null + } + } + + } + } companion object { diff --git a/app/src/main/java/net/pokeranalytics/android/model/retrofit/ConvertResult.kt b/app/src/main/java/net/pokeranalytics/android/model/retrofit/ConvertResult.kt index 1520c711..82d94c5d 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/retrofit/ConvertResult.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/retrofit/ConvertResult.kt @@ -3,7 +3,7 @@ package net.pokeranalytics.android.model.retrofit import com.google.gson.annotations.SerializedName /** - * Currency Converter mapping class + * CurrencyCode Converter mapping class */ class CurrencyConverterValue { @SerializedName("val") diff --git a/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt b/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt index cf0bc977..e49db637 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/utils/Seed.kt @@ -30,7 +30,7 @@ class Seed(var context:Context) : Realm.Transaction { private fun createDefaultCurrencyAndBankroll(realm: Realm) { - // Currency + // CurrencyCode val localeCurrency = UserDefaults.getLocaleCurrency() val defaultCurrency = Currency() defaultCurrency.code = localeCurrency.currencyCode diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt index b67c534e..319aaa12 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt @@ -80,7 +80,7 @@ class HomeActivity : PokerAnalyticsActivity() { fun csv() { - val path = "sdcard/Download/AllCashGames.csv" + val path = "sdcard/Download/RunGoodSessions1.csv" val csv = CSVImporter(path) csv.start() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt index 1db7f1da..eb790102 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt @@ -203,7 +203,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS } /** - * Refresh the rate with the Currency Converter API + * Refresh the rate with the CurrencyCode Converter API */ private fun refreshRate() { diff --git a/app/src/main/java/net/pokeranalytics/android/util/URL.kt b/app/src/main/java/net/pokeranalytics/android/util/URL.kt index 53bb173a..9a8c1fe3 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/URL.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/URL.kt @@ -18,7 +18,7 @@ enum class URL(var value: String) { // Support SUPPORT_EMAIL("support@pokeranalytics.net"), - // Currency Converter API + // CurrencyCode Converter API API_CURRENCY_CONVERTER("https://free.currencyconverterapi.com/api/v5/") } diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt index 81eb3d6b..a82324d6 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt @@ -5,11 +5,17 @@ import io.realm.RealmModel import org.apache.commons.csv.CSVRecord -abstract class DataCSVDescriptor(vararg elements: Field) : CSVDescriptor(*elements) { +enum class DataSource { + POKER_INCOME, + POKER_BANKROLL_TRACKER, + RUNGOOD +} + +abstract class DataCSVDescriptor(source: DataSource, vararg elements: Field) : CSVDescriptor(source, *elements) { val realmModels = mutableListOf() - abstract fun parseData(realm: Realm, record: CSVRecord) : T? + abstract fun parseData(realm: Realm, record: CSVRecord): T? override fun parse(realm: Realm, record: CSVRecord) { @@ -22,7 +28,7 @@ abstract class DataCSVDescriptor(vararg elements: Field) : CSVDe } -open class CSVDescriptor(vararg elements: Field) { +open class CSVDescriptor(var source: DataSource, vararg elements: Field) { protected var fields: List = listOf() protected var fieldMapping: MutableMap = mutableMapOf() @@ -34,10 +40,11 @@ open class CSVDescriptor(vararg elements: Field) { } companion object { - val all: List = listOf(SessionCSVDescriptor.pokerIncomeCash) + val all: List = + listOf(SessionCSVDescriptor.pokerIncomeCash, SessionCSVDescriptor.pokerBankrollTracker, SessionCSVDescriptor.runGoodCashGames, SessionCSVDescriptor.runGoodTournaments) } - fun matches(record: CSVRecord) : Boolean { + fun matches(record: CSVRecord): Boolean { var count = 0 val headers = record.toSet() diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt index 0f46c5ef..ef18a235 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt @@ -17,7 +17,7 @@ open class CSVImporter(var path: String) { val reader = FileReader(this.path) - val parser = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(reader) + val parser = CSVFormat.DEFAULT.withAllowMissingColumnNames().parse(reader) Timber.d("Starting import...") @@ -58,6 +58,7 @@ open class CSVImporter(var path: String) { CSVDescriptor.all.forEach { descriptor -> if (descriptor.matches(record)) { this.currentDescriptor = descriptor + Timber.d("Identified source: ${descriptor.source}") return } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt index d6efa567..b13f776f 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionCSVDescriptor.kt @@ -2,63 +2,122 @@ package net.pokeranalytics.android.util.csv import io.realm.Realm import net.pokeranalytics.android.model.Limit +import net.pokeranalytics.android.model.TableSize +import net.pokeranalytics.android.model.TournamentType +import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.utils.SessionUtils import net.pokeranalytics.android.util.extensions.getOrCreate +import net.pokeranalytics.android.util.extensions.setHourMinutes import org.apache.commons.csv.CSVRecord import timber.log.Timber +import java.util.* sealed class SessionField { data class Start( override var header: String, - override var callback: (() -> Unit)? = null, + override var callback: ((String) -> Date?)? = null, + override val dateFormat: String? = null + ) : DateField + + data class StartTime( + override var header: String, + override var callback: ((String) -> Date?)? = null, override val dateFormat: String? = null ) : DateField data class End( override var header: String, - override var callback: (() -> Unit)? = null, + override var callback: ((String) -> Date?)? = null, + override val dateFormat: String? = null + ) : DateField + + data class EndTime( + override var header: String, + override var callback: ((String) -> Date?)? = null, override val dateFormat: String? = null ) : DateField data class Buyin( override var header: String, - override var callback: (() -> Unit)? = null, + override var callback: ((String) -> Double?)? = null, + override val numberFormat: String? = null + ) : NumberField + + data class NetResult( + override var header: String, + override var callback: ((String) -> Double?)? = null, override val numberFormat: String? = null ) : NumberField data class CashedOut( override var header: String, - override var callback: (() -> Unit)? = null, + override var callback: ((String) -> Double?)? = null, override val numberFormat: String? = null ) : NumberField data class Break( override var header: String, - override var callback: (() -> Unit)? = null, + override var callback: ((String) -> Double?)? = null, override val numberFormat: String? = null ) : NumberField data class Tips( override var header: String, - override var callback: (() -> Unit)? = null, + override var callback: ((String) -> Double?)? = null, + override val numberFormat: String? = null + ) : NumberField + + data class SmallBlind( + override var header: String, + override var callback: ((String) -> Double?)? = null, + override val numberFormat: String? = null + ) : NumberField + + data class BigBlind( + override var header: String, + override var callback: ((String) -> Double?)? = null, override val numberFormat: String? = null ) : NumberField - data class Blind(override var header: String, override var callback: (() -> Unit)? = null) : BlindField - data class Game(override var header: String, override var callback: (() -> Unit)? = null) : Field - data class Location(override var header: String, override var callback: (() -> Unit)? = null) : Field - data class Bankroll(override var header: String, override var callback: (() -> Unit)? = null) : Field - data class LimitType(override var header: String, override var callback: (() -> Unit)? = null) : Field - data class Comment(override var header: String, override var callback: (() -> Unit)? = null) : Field + data class Blind(override var header: String, override var callback: ((String) -> Pair?)? = null) : BlindField + data class Game(override var header: String) : Field + data class Location(override var header: String) : Field + data class LocationType(override var header: String) : Field + data class Bankroll(override var header: String) : Field + data class LimitType(override var header: String) : Field + data class Comment(override var header: String) : Field + data class SessionType(override var header: String) : Field + data class TableSize(override var header: String) : Field + data class CurrencyCode(override var header: String) : Field + data class TournamentName(override var header: String) : Field + data class TournamentType(override var header: String) : Field + + data class CurrencyRate( + override var header: String, + override var callback: ((String) -> Double?)? = null, + override val numberFormat: String? = null + ) : NumberField + + data class TournamentPosition( + override var header: String, + override var callback: ((String) -> Double?)? = null, + override val numberFormat: String? = null + ) : NumberField + data class TournamentNumberOfPlayers( + override var header: String, + override var callback: ((String) -> Double?)? = null, + override val numberFormat: String? = null + ) : NumberField } -class SessionCSVDescriptor(var isTournament: Boolean, vararg elements: Field) : DataCSVDescriptor(*elements) { +class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean, vararg elements: Field) : DataCSVDescriptor(source, *elements) { companion object { val pokerIncomeCash: CSVDescriptor = SessionCSVDescriptor( + DataSource.POKER_INCOME, false, SessionField.Start("Start Time"), SessionField.End("End Time"), @@ -69,40 +128,129 @@ class SessionCSVDescriptor(var isTournament: Boolean, vararg elements: Field) : SessionField.Game("Game"), SessionField.Bankroll("Bankroll"), SessionField.Location("Location"), + SessionField.Location("Location Type"), SessionField.Comment("Note"), SessionField.Tips("Tips"), SessionField.Blind("Stake") ) + val pokerBankrollTracker: CSVDescriptor = SessionCSVDescriptor( + DataSource.POKER_BANKROLL_TRACKER, + true, + SessionField.Start("starttime", dateFormat = "MM/dd/yyyy HH:mm"), + SessionField.End("endtime", dateFormat = "MM/dd/yyyy HH:mm"), + SessionField.SessionType("variant"), + SessionField.Buyin("buyin"), + SessionField.CashedOut("cashout"), + SessionField.Break("breakminutes"), + SessionField.LimitType("limit"), + SessionField.Game("game"), + SessionField.Bankroll("currency"), // same as currency code + SessionField.Location("location"), + SessionField.Comment("sessionnote"), + SessionField.Tips("expensesfromstack"), + SessionField.SmallBlind("smallblind"), + SessionField.BigBlind("bigblind"), + SessionField.TournamentNumberOfPlayers("player"), + SessionField.TournamentPosition("place"), + SessionField.TournamentName("mttname"), + SessionField.CurrencyCode("currency"), + SessionField.CurrencyRate("exchangerate"), + SessionField.TableSize("tablesize") + ) + + val runGoodTournaments: CSVDescriptor = SessionCSVDescriptor( + DataSource.RUNGOOD, + true, + SessionField.Start("Start Date", dateFormat = "dd/MM/yyyy"), + SessionField.StartTime("Start Time"), + SessionField.End("End Date"), + SessionField.EndTime("End Time"), + SessionField.Buyin("Total Buy-In"), + SessionField.CashedOut("Winnings"), + SessionField.NetResult("Profit"), + SessionField.Break("Break"), + SessionField.LimitType("Limit Type"), + SessionField.Game("Game"), + SessionField.Bankroll("Bankroll"), + SessionField.TableSize("Table Type"), + SessionField.Location("Location"), + SessionField.LocationType("Location Type"), + SessionField.Comment("Notes"), + SessionField.CurrencyCode("Currency"), + SessionField.TournamentName("Event Name"), + SessionField.TournamentNumberOfPlayers("Total Players"), + SessionField.TournamentPosition("Finished Place"), + SessionField.TournamentType("Single-Table/Multi-Table") + + ) + + val runGoodCashGames: CSVDescriptor = SessionCSVDescriptor( + DataSource.RUNGOOD, + false, + SessionField.Start("Start Date", dateFormat = "dd/MM/yyyy"), + SessionField.StartTime("Start Time", dateFormat = "HH:mm"), + SessionField.End("End Date", dateFormat = "dd/MM/yyyy"), + SessionField.EndTime("End Time", dateFormat = "HH:mm"), + SessionField.Buyin("Total Buy-In"), + SessionField.CashedOut("Cashed Out"), + SessionField.NetResult("Profit"), + SessionField.Break("Break"), + SessionField.LimitType("Limit Type"), + SessionField.Game("Game"), + SessionField.Bankroll("Bankroll"), + SessionField.TableSize("Table Type"), + SessionField.Location("Location"), + SessionField.LocationType("Location Type"), + SessionField.Comment("Notes"), + SessionField.CurrencyCode("Currency"), + SessionField.Blind("Stakes", callback = { value -> // $10/20 + value.drop(1) + val blinds = value.split("/") + if (blinds.size == 2) { + return@Blind Pair(blinds.first().toDouble(), blinds.last().toDouble()) + } else { + return@Blind null + } + }) + ) + } override fun parseData(realm: Realm, record: CSVRecord): Session? { val session = Session.newInstance(realm, this.isTournament) - fields.forEach { + var isLive = true + var bankrollName: String? = null + var currencyCode: String? = null + var currencyRate: Double? = null - this.fieldMapping[it]?.let { index -> + fields.forEach { field -> + + this.fieldMapping[field]?.let { index -> val value = record.get(index) - when (it) { + when (field) { is SessionField.Start -> { - session.startDate = it.parse(value) + session.startDate = field.parse(value) } is SessionField.End -> { - session.endDate = it.parse(value) + session.endDate = field.parse(value) } - is SessionField.Buyin -> session.result?.buyin = it.parse(value) - is SessionField.CashedOut -> session.result?.cashout = it.parse(value) - is SessionField.Tips -> session.result?.tips = it.parse(value) + is SessionField.StartTime -> { session.startDate?.setHourMinutes(value) } + is SessionField.EndTime -> { session.endDate?.setHourMinutes(value) } + is SessionField.Buyin -> session.result?.buyin = field.parse(value) + is SessionField.CashedOut -> session.result?.cashout = field.parse(value) + is SessionField.Tips -> session.result?.tips = field.parse(value) is SessionField.Break -> { - it.parse(value)?.let { - session.breakDuration = it.toLong() + field.parse(value)?.let { + session.breakDuration = it.toLong() * 60 * 1000 } } is SessionField.Game -> session.game = realm.getOrCreate(value) is SessionField.Location -> session.location = realm.getOrCreate(value) - is SessionField.Bankroll -> session.bankroll = realm.getOrCreate(value) + is SessionField.Bankroll -> bankrollName = value is SessionField.LimitType -> session.limit = Limit.getInstance(value)?.ordinal is SessionField.Comment -> session.comment = value is SessionField.Blind -> { // 1/2 @@ -114,13 +262,28 @@ class SessionCSVDescriptor(var isTournament: Boolean, vararg elements: Field) : Timber.d("Blinds could not be parsed: $value") } } - else -> { + is SessionField.SmallBlind -> session.cgSmallBlind = field.parse(value) + is SessionField.BigBlind -> session.cgBigBlind = field.parse(value) + is SessionField.TableSize -> session.tableSize = TableSize.valueForLabel(value) + is SessionField.SessionType -> { + Session.Type.getValueFromString(value)?.let { type -> + session.type = type.ordinal + } } + is SessionField.TournamentPosition -> session.result?.tournamentFinalPosition = field.parse(value)?.toInt() + is SessionField.TournamentName -> session.tournamentName = realm.getOrCreate(value) + is SessionField.TournamentType -> session.tournamentType = TournamentType.getValueForLabel(value)?.ordinal + is SessionField.TournamentNumberOfPlayers -> session.tournamentNumberOfPlayers = field.parse(value)?.toInt() + is SessionField.CurrencyCode -> currencyCode = value + is SessionField.CurrencyRate -> currencyRate = field.parse(value) + else -> { } } } } + session.bankroll = Bankroll.getOrCreate(realm, bankrollName ?: "Import", isLive, currencyCode, currencyRate) + val startDate = session.startDate val endDate = session.endDate val net = session.result?.net diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/TypedField.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/TypedField.kt index fd0b659a..c4a27b6d 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/TypedField.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/TypedField.kt @@ -1,8 +1,5 @@ package net.pokeranalytics.android.util.csv -import io.realm.Realm -import net.pokeranalytics.android.model.interfaces.NameManageable -import net.pokeranalytics.android.util.extensions.getOrCreate import timber.log.Timber import java.text.DateFormat import java.text.NumberFormat @@ -12,9 +9,15 @@ import java.util.* interface NumberField: TypedField { + val numberFormat: String? override fun parse(value: String) : Double? { + + if (value.isEmpty()) { + return null + } + val formatter = NumberFormat.getInstance() return try { @@ -27,6 +30,7 @@ interface NumberField: TypedField { } interface DateField : TypedField { + val dateFormat: String? override fun parse(value: String) : Date? { @@ -42,9 +46,13 @@ interface DateField : TypedField { } -interface BlindField : TypedField { +interface BlindField : TypedField> { - override fun parse(value: String) : Double? { + override fun parse(value: String) : Pair? { + + this.callback?.let { cb -> + return cb(value) + } return null } @@ -52,17 +60,9 @@ interface BlindField : TypedField { interface TypedField : Field { fun parse(value: String) : T? -} - -interface NamedDataField : Field { - - fun getOrCreate(realm: Realm, clazz: Class, name: String) : T { - return realm.getOrCreate(clazz, name) - } - + var callback: ((String) -> T?)? } interface Field { val header: String - var callback: (() -> Unit)? } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt index 519cdd94..83583070 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt @@ -160,4 +160,8 @@ fun Date.getNextMinuteInMilliseconds() : Long { calendar.set(Calendar.SECOND, 0) calendar.set(Calendar.MILLISECOND, 0) return calendar.time.time - this.time -} \ No newline at end of file +} + +fun Date.setHourMinutes(value: String) { + +}