diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6edfa7d8..7efe637b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + "No $limit" - POT -> "Pot $limit" - FIXED -> "Fixed $limit" - MIXED -> "Mixed $limit" - SPREAD -> "Spread $limit" + NO -> "No Limit" + POT -> "Pot Limit" + FIXED -> "Limit" + MIXED -> "Mixed Limit" + SPREAD -> "Spread Limit" } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt index 91de43f1..c97caf82 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Result.kt @@ -6,7 +6,6 @@ import io.realm.RealmResults import io.realm.annotations.Ignore import io.realm.annotations.LinkingObjects import io.realm.annotations.RealmClass -import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition @@ -51,13 +50,13 @@ open class Result : RealmObject(), Filterable { var netResult: Double? = null set(value) { - this.session?.bankroll?.let { bankroll -> - if (bankroll.live) { - throw PAIllegalStateException("Can't set net result on a live bankroll") - } - } ?: run { - throw PAIllegalStateException("Session doesn't have any bankroll") - } +// this.session?.bankroll?.let { bankroll -> +// if (bankroll.live) { +// throw PAIllegalStateException("Can't set net result on a live bankroll") +// } +// } ?: run { +// throw PAIllegalStateException("Session doesn't have any bankroll") +// } field = value this.computeNet(false) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ImportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ImportActivity.kt index 2a83c802..69b51aa8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/ImportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ImportActivity.kt @@ -47,6 +47,8 @@ class ImportActivity : PokerAnalyticsActivity() { intent?.data?.let { this.fileURI = it + } ?: run { + this.fileURI = intent.getParcelableExtra(ImportActivity.IntentKey.URI.keyName) as Uri } setContentView(R.layout.activity_import) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt index 34360ae6..18940892 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt @@ -132,6 +132,33 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate { super.onViewCreated(view, savedInstanceState) initUI() initData() + +// if (ContextCompat.checkSelfPermission(requireActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) +// != PackageManager.PERMISSION_GRANTED) { +// +// if (ActivityCompat.shouldShowRequestPermissionRationale(requireActivity(), +// Manifest.permission.READ_EXTERNAL_STORAGE)) { +// // Show an explanation to the user *asynchronously* -- don't block +// // this thread waiting for the user's response! After the user +// // sees the explanation, try again to request the permission. +// } else { +// // No explanation needed, we can request the permission. +// ActivityCompat.requestPermissions(requireActivity(), +// arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), +// 12) +// +// // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an +// // app-defined int constant. The callback method gets the +// // result of the request. +// } +// +// } else { +// +// val uri = Uri.fromFile(File("sdcard/Download/Results_0802.csv")) +// ImportActivity.newInstanceForResult(requireActivity(), uri) +// +// } + } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 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 b28c5182..dbb73a80 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 @@ -103,7 +103,8 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField) listOf(ProductCSVDescriptors.pokerIncomeCash, ProductCSVDescriptors.pokerBankrollTracker, ProductCSVDescriptors.runGoodCashGames, - ProductCSVDescriptors.runGoodTournaments) + ProductCSVDescriptors.runGoodTournaments, + ProductCSVDescriptors.pokerAgent) } /** diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt index 02d86087..627b3a17 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt @@ -4,6 +4,18 @@ class ProductCSVDescriptors { companion object { + val pokerAgent: CSVDescriptor = SessionCSVDescriptor( + DataSource.POKER_INCOME, + false, + SessionField.Start("Date ", dateFormat = "MM-dd-yyyy", defaultTimeFormat = "20:00"), + SessionField.Location("Location"), + SessionField.SmallBlind("SB"), + SessionField.BigBlind("BB"), + SessionField.NetResult("P/L"), + SessionField.Duration("Hrs"), + SessionField.LimitAndGame("Type") + ) + val pokerIncomeCash: CSVDescriptor = SessionCSVDescriptor( DataSource.POKER_INCOME, false, 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 5b76f362..44bdfca1 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 @@ -1,6 +1,7 @@ package net.pokeranalytics.android.util.csv import io.realm.Realm +import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.model.TournamentType @@ -144,7 +145,11 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean val value = record.get(index) when (field) { is SessionField.Start -> { + startDate = field.parse(value) + field.defaultTimeFormat?.let { + startDate?.setHourMinutes(it) + } } is SessionField.End -> { endDate = field.parse(value) @@ -155,6 +160,19 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean is SessionField.EndTime -> { endDate?.setHourMinutes(value) } + is SessionField.Duration -> { + val hoursDuration = field.parse(value) + + if (startDate != null && hoursDuration != null) { + val minutes = (hoursDuration * 60.0).toInt() + val calendar = Calendar.getInstance() + calendar.time = startDate + calendar.add(Calendar.MINUTE, minutes) + endDate = calendar.time + } else { + throw PAIllegalStateException("start date ($startDate) + hoursDuration ($hoursDuration) required") + } + } is SessionField.Buyin -> { val buyin = field.parse(value) session.result?.buyin = buyin @@ -164,6 +182,7 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean } } is SessionField.CashedOut -> session.result?.cashout = field.parse(value) + is SessionField.NetResult -> session.result?.netResult = field.parse(value) is SessionField.SessionType -> { Session.Type.getValueFromString(value)?.let { type -> session.type = type.ordinal @@ -177,6 +196,21 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean session.breakDuration = it.toLong() * 60 * 1000 } } + is SessionField.LimitAndGame -> { + if (value.isNotEmpty()) { + var limitAndGame = value + for (someLimit in Limit.values()) { + if (value.startsWith(someLimit.longName)) { + session.limit = someLimit.ordinal + limitAndGame = limitAndGame.removePrefix(someLimit.longName) + break + } + } + session.game = realm.getOrCreate(limitAndGame.trim()) + + } else { + } + } is SessionField.Game -> { if (value.isNotEmpty()) { session.game = realm.getOrCreate(value) @@ -184,8 +218,9 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean } } is SessionField.Location -> { - if (value.isNotEmpty()) { - session.location = realm.getOrCreate(value) + val trimmedValue = value.trim() + if (trimmedValue.isNotEmpty()) { + session.location = realm.getOrCreate(trimmedValue) } else { } } @@ -197,8 +232,18 @@ class SessionCSVDescriptor(source: DataSource, private var isTournament: Boolean session.cgSmallBlind = blinds?.first session.cgBigBlind = blinds?.second } - is SessionField.SmallBlind -> session.cgSmallBlind = field.parse(value) - is SessionField.BigBlind -> session.cgBigBlind = field.parse(value) + is SessionField.SmallBlind -> { + val sb = field.parse(value) + if (sb != null && sb > 0.0) { + session.cgSmallBlind = sb + } else {} + } + is SessionField.BigBlind -> { + val bb = field.parse(value) + if (bb != null && bb > 0.0) { + session.cgBigBlind = bb + } else {} + } is SessionField.TableSize -> session.tableSize = TableSize.valueForLabel(value) is SessionField.TournamentPosition -> session.result?.tournamentFinalPosition = field.parse(value)?.toInt() 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 677c60a4..6ee7e6ad 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 @@ -19,7 +19,8 @@ sealed class SessionField { data class Start( override var header: String, override var callback: ((String) -> Date?)? = null, - override val dateFormat: String? = null + override val dateFormat: String? = null, + val defaultTimeFormat: String? = null ) : DateCSVField data class StartTime( @@ -40,6 +41,12 @@ sealed class SessionField { override val dateFormat: String? = null ) : DateCSVField + data class Duration( + override var header: String, + override var callback: ((String) -> Double?)? = null, + override val numberFormat: String? = null + ) : NumberCSVField + data class Buyin( override var header: String, override var callback: ((String) -> Double?)? = null, @@ -110,6 +117,7 @@ sealed class SessionField { BlindCSVField data class Game(override var header: String) : CSVField + data class LimitAndGame(override var header: String) : CSVField data class Location(override var header: String) : CSVField data class LocationType(override var header: String) : CSVField data class Bankroll(override var header: String) : CSVField 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 d65d8a09..2b7f5cf5 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 @@ -180,7 +180,9 @@ fun Date.getNextMinuteInMilliseconds(): Long { fun Date.setHourMinutes(value: String, dateFormat: String = "HH:mm") { val calendar1 = Calendar.getInstance() calendar1.time = this - val calendar2 = Calendar.getInstance().apply { time = SimpleDateFormat(dateFormat, Locale.getDefault()).parse(value) } + val calendar2 = Calendar.getInstance().apply { + time = SimpleDateFormat(dateFormat, Locale.getDefault()).parse(value) + } calendar1.set(Calendar.HOUR_OF_DAY, calendar2.get(Calendar.HOUR_OF_DAY)) calendar1.set(Calendar.MINUTE, calendar2.get(Calendar.MINUTE)) calendar1.set(Calendar.SECOND, 0)