diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt index aa187757..97aac8c7 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt @@ -23,6 +23,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.util.enumerations.IntIdentifiable +import timber.log.Timber import java.util.* import kotlin.collections.ArrayList @@ -39,7 +40,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa val customField = CustomField() customField.name = name customField.type = type - customField + realm.copyToRealm(customField) } } @@ -299,12 +300,15 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa this.entriesToDelete.clear() } - fun getOrCreateEntry(value: String): CustomFieldEntry { - this.entries.firstOrNull { it.value == value }?.let { + fun getOrCreateEntry(realm: Realm, value: String): CustomFieldEntry { + this.entries.find { it.value == value }?.let { + Timber.d("L>> get") return it } ?: run { - val entry = this.addEntry() + Timber.d("L>> create") + val entry = realm.copyToRealm(CustomFieldEntry()) entry.value = value + this.entries.add(entry) return entry } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt index d3c233c4..10ad57b1 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt @@ -100,7 +100,7 @@ class ImportFragment : RealmFragment(), ImportDelegate { val message = exceptionMessage + ". " + requireContext().getString(R.string.import_error) val snackBar = Snackbar.make(view!!, message, Snackbar.LENGTH_INDEFINITE) val textView = snackBar.view.findViewById(com.google.android.material.R.id.snackbar_text) - textView.maxLines = 4 + textView.maxLines = 5 snackBar.show() } 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 5379d292..5585ef44 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 @@ -87,9 +87,11 @@ abstract class DataCSVDescriptor(source: DataSource, vararg el lines.add(this.csvHeaders) dataSequence.forEach { data -> + val line = mutableListOf() - this.staticFields.forEach { field -> - line.add(this.toCSV(data, field) ?: "") + this.fields.forEach { field -> + val string = this.toCSV(data, field) + line.add(string ?: "") } lines.add(line.joinToString(",")) } @@ -112,7 +114,7 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField) /** * The CSVField list describing the CSV header format */ - protected var staticFields: MutableList = mutableListOf() + protected var fields: MutableList = mutableListOf() /** * A list of dynamic CSVField, described in the CSV header @@ -126,7 +128,7 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField) init { if (elements.isNotEmpty()) { - this.staticFields = elements.toMutableList() + this.fields = elements.toMutableList() } } @@ -151,7 +153,7 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField) var count = 0 val headers = record.toSet() - this.staticFields.forEach { field -> + this.fields.forEach { field -> val index = headers.indexOf(field.header) if (index >= 0) { @@ -159,8 +161,8 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField) count++ } } - val mandatoryFields = this.staticFields.filter { !it.optional } - Timber.d("source= ${this.source.name} > total fields = ${this.staticFields.size}, identified = $count") + val mandatoryFields = this.fields.filter { !it.optional } + Timber.d("source= ${this.source.name} > total fields = ${this.fields.size}, identified = $count") return count >= mandatoryFields.size } @@ -175,7 +177,7 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField) protected val csvHeaders: String get() { val headers = mutableListOf() - this.staticFields.forEach { + this.fields.forEach { headers.add(it.header) } return headers.joinToString(",") diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt index 2986e96e..e0befb16 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/PACSVDescriptor.kt @@ -43,7 +43,7 @@ abstract class PACSVDescriptor(source: DataSource, var stackingIn: Double? = null var stackingOut: Double? = null - this.staticFields.forEach { field -> + this.fields.forEach { field -> this.fieldMapping[field]?.let { index -> @@ -200,15 +200,23 @@ abstract class PACSVDescriptor(source: DataSource, stackingOut = field.parse(value) } is SessionField.ListCustomField -> { - val entry = field.customField.getOrCreateEntry(value) + val entry = field.customField.getOrCreateEntry(realm, value) session.customFieldEntries.add(entry) } is SessionField.NumberCustomField -> { val customField = field.customField - val entry = CustomFieldEntry() - entry.numericValue = field.parse(value) - customField.entries.add(entry) - session.customFieldEntries.add(entry) + + field.parse(value)?.let { number -> + Timber.d("N>> create: $number") + val entry = realm.copyToRealm(CustomFieldEntry()) + entry.numericValue = number + + customField.entries.add(entry) + session.customFieldEntries.add(entry) + } ?: run { + Timber.w("failed parse of numeric value: $value") + } + } else -> { } 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 4d7fc9ff..d6db5cbf 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 @@ -7,6 +7,7 @@ import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.Session import org.apache.commons.csv.CSVRecord +import timber.log.Timber /** * A SessionCSVDescriptor is a CSVDescriptor specialized in parsing Session objects @@ -20,14 +21,14 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el realm.where(CustomField::class.java).findAll().sort("name").forEach { customField -> val header = customField.name + CustomFieldCSVField.separator + customField.type val f = when (customField.type) { - CustomField.Type.LIST.ordinal -> { - SessionField.NumberCustomField(header, customField) + CustomField.Type.LIST.uniqueIdentifier -> { + SessionField.ListCustomField(header, customField) } else -> { - SessionField.ListCustomField(header, customField) + SessionField.NumberCustomField(header, customField) } } - this.staticFields.add(f) + this.fields.add(f) } realm.close() @@ -75,10 +76,13 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el is SessionField.TournamentPosition -> field.format(data.result?.tournamentFinalPosition) is SessionField.Comment -> data.comment is SessionField.NumberCustomField -> { - val entry = data.customFieldEntries.first { it.customField == field.customField } - field.format(entry.numericValue) + val entry = data.customFieldEntries.find { it.customField?.id == field.customField.id } + field.format(entry?.numericValue) + } + is SessionField.ListCustomField -> { + val entry = data.customFieldEntries.find { it.customField?.id == field.customField.id } + entry?.value } - is SessionField.ListCustomField -> data.customFieldEntries.first { it.customField == field.customField }.value else -> null } @@ -103,11 +107,11 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el val customField = CustomField.getOrCreate(realm, name, type) val field = when (customField.type) { - CustomField.Type.LIST.ordinal -> { - SessionField.NumberCustomField(header, customField) + CustomField.Type.LIST.uniqueIdentifier -> { + SessionField.ListCustomField(header, customField) } else -> { - SessionField.ListCustomField(header, customField) + SessionField.NumberCustomField(header, customField) } } @@ -115,7 +119,7 @@ class SessionCSVDescriptor(source: DataSource, isTournament: Boolean?, vararg el if (index >= 0) { this.fieldMapping[field] = index } - this.staticFields.add(field) + this.fields.add(field) } diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt index bfc97d64..842c92c4 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt @@ -93,20 +93,26 @@ sealed class SessionField { override var callback: ((String) -> Double?)? = null ) : NumberCSVField { - override fun parse(value: String): Double? { + private val multiplier: Int + get() { + return when (unit) { + Calendar.HOUR -> 3600 * 1000 + Calendar.MINUTE -> 60 * 1000 + Calendar.SECOND -> 1000 + else -> throw PAIllegalStateException("Unmanaged time unit: $unit") + } + } + override fun parse(value: String): Double? { this.callback?.let { return it(value) } - val v = NumberCSVField.defaultParse(value) - val multiplier = when (unit) { - Calendar.HOUR -> 3600 * 1000 - Calendar.MINUTE -> 60 * 1000 - Calendar.SECOND -> 1000 - else -> throw PAIllegalStateException("Unmanaged time unit: $unit") - } - return v?.times(multiplier) + return v?.times(this.multiplier) + } + + override fun format(data: Double?): String? { + return super.format(data?.div(multiplier)) } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionTransactionCSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionTransactionCSVDescriptor.kt index 5d720445..e71a1585 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionTransactionCSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionTransactionCSVDescriptor.kt @@ -39,7 +39,7 @@ class SessionTransactionCSVDescriptor(source: DataSource, private var isTourname override fun parseData(realm: Realm, record: CSVRecord): Identifiable? { var dataType: DataType? = null - val typeField = staticFields.firstOrNull { it is SessionField.SessionType } + val typeField = fields.firstOrNull { it is SessionField.SessionType } typeField?.let { field -> this.fieldMapping[field]?.let { index -> val typeValue = record.get(index) @@ -65,7 +65,7 @@ class SessionTransactionCSVDescriptor(source: DataSource, private var isTourname var buyin: Double? = null var cashedOut: Double? = null - this.staticFields.forEach { field -> + this.fields.forEach { field -> val index = this.fieldMapping[field] if (index != null) { diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/TransactionCSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/TransactionCSVDescriptor.kt index 978aa016..3b2db42d 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/TransactionCSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/TransactionCSVDescriptor.kt @@ -24,7 +24,7 @@ class TransactionCSVDescriptor(source: DataSource, vararg elements: CSVField) : var currencyCode: String? = null var currencyRate: Double? = null - for (field in this.staticFields) { + for (field in this.fields) { val index = this.fieldMapping[field] if (index != null) {