diff --git a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt index b8358605..9152f79c 100644 --- a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt +++ b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt @@ -21,6 +21,7 @@ sealed class PokerAnalyticsException(message: String) : Exception(message) { object QueryTypeUnhandled: PokerAnalyticsException(message = "queryWith type not handled") object QueryValueMapUnexpectedValue: PokerAnalyticsException(message = "valueMap null not expected") object FilterElementExpectedValueMissing : PokerAnalyticsException(message = "queryWith is empty or null") + object BottomSheetException : PokerAnalyticsException(message = "Issue when creating a bottomsheet") data class FilterElementTypeMissing(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "queryWith element '$filterElementRow' type is missing") data class QueryValueMapMissingKeys(val missingKeys: List) : PokerAnalyticsException(message = "valueMap does not contain $missingKeys") data class UnknownQueryTypeForRow(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "no queryWith type for $filterElementRow") 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 8944468e..0e137fe2 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 @@ -872,17 +872,11 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat "defaultValue" to this.tournamentType ) ) - SessionRow.TABLE_SIZE -> row.editingDescriptors( + SessionRow.TABLE_SIZE -> row.editingDescriptors( mapOf( "defaultValue" to this.tableSize ) ) - SessionRow.BLINDS -> row.editingDescriptors( - mapOf( - "sb" to cgSmallBlind?.round(), - "bb" to cgBigBlind?.round() - ) - ) SessionRow.BUY_IN -> row.editingDescriptors( mapOf( "bb" to cgBigBlind, diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt index 57ac596f..e62fb037 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt @@ -10,17 +10,20 @@ import android.view.View import android.view.ViewGroup import android.view.WindowManager import androidx.appcompat.view.ContextThemeWrapper +import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import com.google.android.material.bottomsheet.BottomSheetDialogFragment import io.realm.RealmModel import kotlinx.android.synthetic.main.fragment_bottom_sheet.* import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.exceptions.PokerAnalyticsException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditData import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow @@ -62,6 +65,27 @@ open class BottomSheetFragment(val row: RowRepresentable) : BottomSheetDialogFra bottomSheetFragment.currentCurrency = currentCurrency return bottomSheetFragment } + + fun newCreate( + row: RowRepresentable, + delegate: RowRepresentableDelegate, + dataSource: RowRepresentableEditData?, + isDeletable: Boolean? = false, + valueHasPlaceholder: Boolean? = null + ): BottomSheetFragment { + + if (delegate !is Fragment) throw PokerAnalyticsException.BottomSheetException + + val bottomSheetFragment = row.bottomSheetType.newInstance(row) + bottomSheetFragment.show(delegate.fragmentManager, "bottomSheet") + bottomSheetFragment.delegate = delegate + bottomSheetFragment.rowRepresentableEditDescriptors = dataSource?.descriptors + bottomSheetFragment.isClearable = row.valueCanBeClearedWhenEditing + bottomSheetFragment.isDeletable = isDeletable ?: true + bottomSheetFragment.valueHasPlaceholder = valueHasPlaceholder ?: true + bottomSheetFragment.currentCurrency = dataSource?.currency + return bottomSheetFragment + } } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt b/app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt index 0e1d1e45..50a4e9b4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt @@ -59,7 +59,42 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener, return dateTimePickerManager } - } + + fun newCreate( + context: Context, + row: RowRepresentable, + delegate: RowRepresentableDelegate, + date: Date?, + minimumDate: Date? = null, + onlyDate: Boolean? = false, + onlyTime: Boolean? = false, + isClearable: Boolean? = true + ): DateTimePickerManager { + + val calendar = Calendar.getInstance() + calendar.time = date ?: Date() + + val dateTimePickerManager = DateTimePickerManager() + dateTimePickerManager.context = context + dateTimePickerManager.row = row + dateTimePickerManager.delegate = delegate + dateTimePickerManager.calendar = calendar + dateTimePickerManager.minimumDate = minimumDate + dateTimePickerManager.onlyDate = onlyDate ?: false + dateTimePickerManager.onlyTime = onlyTime ?: false + dateTimePickerManager.isClearable = isClearable ?: true + + if (dateTimePickerManager.onlyTime) { + dateTimePickerManager.showTimePicker() + } else { + dateTimePickerManager.showDatePicker() + } + + return dateTimePickerManager + } + + + } override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) { calendar.set(Calendar.YEAR, year) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index 7ce8b628..bb75d9cd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -22,8 +22,10 @@ interface EditDataSource { return null } - fun startEditing(dataSource:Any?, parent:Fragment?) { - } + fun startEditing(dataSource:Any?, parent:Fragment?) {} + + val valueCanBeClearedWhenEditing: Boolean + get() { return true } } interface DefaultEditDataSource : EditDataSource, Localizable { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentableEditDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentableEditDescriptor.kt index bdb6bf4b..1eb2f716 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentableEditDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentableEditDescriptor.kt @@ -1,6 +1,9 @@ package net.pokeranalytics.android.ui.view import io.realm.RealmResults +import net.pokeranalytics.android.util.UserDefaults +import java.util.* +import kotlin.collections.ArrayList /** * An container class to describe the way an field of an object will be edited @@ -11,4 +14,12 @@ class RowRepresentableEditDescriptor( var inputType: Int? = null, var data: RealmResults? = null, var staticData: List? = null -) \ No newline at end of file +) + +class RowRepresentableEditData(val currency: Currency = UserDefaults.currency) { + var descriptors = ArrayList() + + fun append(defaultValue: Any? = null, hint: Int? = null, inputType: Int? = null, data: RealmResults? = null, staticData: List? = null) { + descriptors.add(RowRepresentableEditDescriptor(defaultValue, hint, inputType, data, staticData)) + } +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt index 1eeb65e8..45475521 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt @@ -8,13 +8,13 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState -import net.pokeranalytics.android.model.realm.Bankroll -import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.helpers.DateTimePickerManager import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditData import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.extensions.round @@ -193,7 +193,6 @@ enum class SessionRow : RowRepresentable { when (this) { START_DATE -> DateTimePickerManager.create(parent.requireContext(), this, parent, dataSource.startDate) END_DATE -> { - if (dataSource.startDate == null) { Toast.makeText(parent.context, R.string.session_missing_start_date, Toast.LENGTH_SHORT).show() } else { @@ -205,30 +204,74 @@ enum class SessionRow : RowRepresentable { dataSource.startDate ) } - - } - BANKROLL -> { - BottomSheetFragment.create(parent.fragmentManager, this, parent, this.editingData(dataSource), false, dataSource.currency) } - else -> BottomSheetFragment.create( - parent.fragmentManager, - this, - parent, - this.editingData(dataSource), - currentCurrency = dataSource.currency - ) + else -> BottomSheetFragment.newCreate(this, parent, this.editingData(dataSource)) } } - private fun editingData(session:Session): ArrayList? { - return when (this) { - BANKROLL -> { - arrayListOf( - RowRepresentableEditDescriptor(session.bankroll, data = session.realm.sorted() as RealmResults) - ) + override val valueCanBeClearedWhenEditing: Boolean + get() { + return when (this) { + BANKROLL -> false + else -> true + } + } + + private fun editingData(session:Session): RowRepresentableEditData? { + val data = RowRepresentableEditData(session.currency) + when (this) { + BANKROLL -> data.append(session.bankroll, data = session.realm.sorted() as RealmResults) + CASHED_OUT, PRIZE -> data.append(session.result?.cashout, inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL or InputType.TYPE_NUMBER_FLAG_SIGNED) + NET_RESULT -> data.append(session.result?.netResult, inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL or InputType.TYPE_NUMBER_FLAG_SIGNED) + INITIAL_BUY_IN -> data.append(session.tournamentEntryFee?.round(), inputType = InputType.TYPE_CLASS_NUMBER) + BUY_IN -> { + val bb: Double? = session.cgBigBlind + val fee: Double? = session.tournamentEntryFee + val ratedBuyin: Double? = session.result?.buyin + if (bb != null) { + data.append(100.0 * bb) + data.append(200.0 * bb) + } else if (fee != null) { + data.append(fee) + data.append(fee * 2.0) + } else { + data.append(0) + data.append(0) + } + data.append(ratedBuyin) + data.append(inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL) + data.append(inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL) } - else -> null + POSITION -> data.append(session.result?.tournamentFinalPosition, inputType = InputType.TYPE_CLASS_NUMBER) + PLAYERS -> data.append(session.tournamentNumberOfPlayers.toString(), inputType = InputType.TYPE_CLASS_NUMBER) + TIPS -> { + val sb: String? = session.cgSmallBlind?.round() + val bb: String? = session.cgBigBlind?.round() + val tips: Double? = session.result?.tips + data.append(sb ?: 0.0) + data.append(bb ?: 0.0) + data.append(tips ?: 0.0) + data.append("", inputType = InputType.TYPE_CLASS_NUMBER) + data.append("", inputType = InputType.TYPE_CLASS_NUMBER) + } + GAME -> { + data.append(session.limit) + data.append(session.game, data = session.realm.sorted() as RealmResults) + } + BLINDS -> { + data.append(session.cgSmallBlind?.round(), R.string.smallblind, InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL) + data.append(session.cgBigBlind?.round(), R.string.bigblind, InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL) + } + LOCATION -> data.append(session.location, data = session.realm.sorted() as RealmResults) + TABLE_SIZE -> data.append(session.tableSize) + TOURNAMENT_TYPE -> data.append(session.tournamentType, staticData = TournamentType.values().map { it }) + TOURNAMENT_NAME -> data.append(session.tournamentName, data = session.realm.sorted() as RealmResults) + TOURNAMENT_FEATURE -> data.append(session.tournamentFeatures, data = session.realm.sorted() as RealmResults) + BREAK_TIME -> data.append(hint = R.string.in_minutes, inputType = InputType.TYPE_CLASS_NUMBER) + COMMENT -> data.append(session.comment, R.string.comment) + else -> {} } + return data } @@ -343,20 +386,6 @@ enum class SessionRow : RowRepresentable { val defaultValue: Int? by map arrayListOf(RowRepresentableEditDescriptor(defaultValue)) } - TIPS -> { - val sb: String? by map - val bb: String? by map - val tips: Double? by map - - // Disable the buttons with value = 0, add current value & set the 2 edit texts - arrayListOf( - RowRepresentableEditDescriptor(sb ?: 0.0), - RowRepresentableEditDescriptor(bb ?: 0.0), - RowRepresentableEditDescriptor(tips ?: 0.0), - RowRepresentableEditDescriptor("", inputType = InputType.TYPE_CLASS_NUMBER), - RowRepresentableEditDescriptor("", inputType = InputType.TYPE_CLASS_NUMBER) - ) - } TOURNAMENT_TYPE -> { val defaultValue: Any? by map arrayListOf(