wip refactoring editDescriptor

dev^2
Razmig Sarkissian 6 years ago
parent 20494c7849
commit 63d6c9b5b9
  1. 1
      app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt
  2. 6
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  3. 24
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt
  4. 35
      app/src/main/java/net/pokeranalytics/android/ui/helpers/DateTimePickerManager.kt
  5. 6
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt
  6. 11
      app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentableEditDescriptor.kt
  7. 97
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt

@ -21,6 +21,7 @@ sealed class PokerAnalyticsException(message: String) : Exception(message) {
object QueryTypeUnhandled: PokerAnalyticsException(message = "queryWith type not handled") object QueryTypeUnhandled: PokerAnalyticsException(message = "queryWith type not handled")
object QueryValueMapUnexpectedValue: PokerAnalyticsException(message = "valueMap null not expected") object QueryValueMapUnexpectedValue: PokerAnalyticsException(message = "valueMap null not expected")
object FilterElementExpectedValueMissing : PokerAnalyticsException(message = "queryWith is empty or null") 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 FilterElementTypeMissing(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "queryWith element '$filterElementRow' type is missing")
data class QueryValueMapMissingKeys(val missingKeys: List<String>) : PokerAnalyticsException(message = "valueMap does not contain $missingKeys") data class QueryValueMapMissingKeys(val missingKeys: List<String>) : PokerAnalyticsException(message = "valueMap does not contain $missingKeys")
data class UnknownQueryTypeForRow(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "no queryWith type for $filterElementRow") data class UnknownQueryTypeForRow(val filterElementRow: FilterElementRow) : PokerAnalyticsException(message = "no queryWith type for $filterElementRow")

@ -877,12 +877,6 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
"defaultValue" to this.tableSize "defaultValue" to this.tableSize
) )
) )
SessionRow.BLINDS -> row.editingDescriptors(
mapOf(
"sb" to cgSmallBlind?.round(),
"bb" to cgBigBlind?.round()
)
)
SessionRow.BUY_IN -> row.editingDescriptors( SessionRow.BUY_IN -> row.editingDescriptors(
mapOf( mapOf(
"bb" to cgBigBlind, "bb" to cgBigBlind,

@ -10,17 +10,20 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import androidx.appcompat.view.ContextThemeWrapper import androidx.appcompat.view.ContextThemeWrapper
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import io.realm.RealmModel import io.realm.RealmModel
import kotlinx.android.synthetic.main.fragment_bottom_sheet.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.exceptions.PokerAnalyticsException
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.view.RowRepresentable 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.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow
import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow
@ -62,6 +65,27 @@ open class BottomSheetFragment(val row: RowRepresentable) : BottomSheetDialogFra
bottomSheetFragment.currentCurrency = currentCurrency bottomSheetFragment.currentCurrency = currentCurrency
return bottomSheetFragment 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? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

@ -59,6 +59,41 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener,
return dateTimePickerManager 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) { override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {

@ -22,8 +22,10 @@ interface EditDataSource {
return null return null
} }
fun startEditing(dataSource:Any?, parent:Fragment?) { fun startEditing(dataSource:Any?, parent:Fragment?) {}
}
val valueCanBeClearedWhenEditing: Boolean
get() { return true }
} }
interface DefaultEditDataSource : EditDataSource, Localizable { interface DefaultEditDataSource : EditDataSource, Localizable {

@ -1,6 +1,9 @@
package net.pokeranalytics.android.ui.view package net.pokeranalytics.android.ui.view
import io.realm.RealmResults 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 * An container class to describe the way an field of an object will be edited
@ -12,3 +15,11 @@ class RowRepresentableEditDescriptor(
var data: RealmResults<RowRepresentable>? = null, var data: RealmResults<RowRepresentable>? = null,
var staticData: List<RowRepresentable>? = null var staticData: List<RowRepresentable>? = null
) )
class RowRepresentableEditData(val currency: Currency = UserDefaults.currency) {
var descriptors = ArrayList<RowRepresentableEditDescriptor>()
fun append(defaultValue: Any? = null, hint: Int? = null, inputType: Int? = null, data: RealmResults<RowRepresentable>? = null, staticData: List<RowRepresentable>? = null) {
descriptors.add(RowRepresentableEditDescriptor(defaultValue, hint, inputType, data, staticData))
}
}

@ -8,13 +8,13 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.TournamentType
import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.SessionState
import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
import net.pokeranalytics.android.ui.helpers.DateTimePickerManager import net.pokeranalytics.android.ui.helpers.DateTimePickerManager
import net.pokeranalytics.android.ui.view.RowRepresentable 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.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.extensions.round import net.pokeranalytics.android.util.extensions.round
@ -193,7 +193,6 @@ enum class SessionRow : RowRepresentable {
when (this) { when (this) {
START_DATE -> DateTimePickerManager.create(parent.requireContext(), this, parent, dataSource.startDate) START_DATE -> DateTimePickerManager.create(parent.requireContext(), this, parent, dataSource.startDate)
END_DATE -> { END_DATE -> {
if (dataSource.startDate == null) { if (dataSource.startDate == null) {
Toast.makeText(parent.context, R.string.session_missing_start_date, Toast.LENGTH_SHORT).show() Toast.makeText(parent.context, R.string.session_missing_start_date, Toast.LENGTH_SHORT).show()
} else { } else {
@ -205,30 +204,74 @@ enum class SessionRow : RowRepresentable {
dataSource.startDate dataSource.startDate
) )
} }
}
BANKROLL -> {
BottomSheetFragment.create(parent.fragmentManager, this, parent, this.editingData(dataSource), false, dataSource.currency)
} }
else -> BottomSheetFragment.create( else -> BottomSheetFragment.newCreate(this, parent, this.editingData(dataSource))
parent.fragmentManager,
this,
parent,
this.editingData(dataSource),
currentCurrency = dataSource.currency
)
} }
} }
private fun editingData(session:Session): ArrayList<RowRepresentableEditDescriptor>? { override val valueCanBeClearedWhenEditing: Boolean
get() {
return when (this) { return when (this) {
BANKROLL -> { BANKROLL -> false
arrayListOf( else -> true
RowRepresentableEditDescriptor(session.bankroll, data = session.realm.sorted<Bankroll>() as RealmResults<RowRepresentable>)
)
} }
else -> null
} }
private fun editingData(session:Session): RowRepresentableEditData? {
val data = RowRepresentableEditData(session.currency)
when (this) {
BANKROLL -> data.append(session.bankroll, data = session.realm.sorted<Bankroll>() as RealmResults<RowRepresentable>)
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)
}
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<Game>() as RealmResults<RowRepresentable>)
}
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<Location>() as RealmResults<RowRepresentable>)
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<TournamentName>() as RealmResults<RowRepresentable>)
TOURNAMENT_FEATURE -> data.append(session.tournamentFeatures, data = session.realm.sorted<TournamentFeature>() as RealmResults<RowRepresentable>)
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 val defaultValue: Int? by map
arrayListOf(RowRepresentableEditDescriptor(defaultValue)) 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 -> { TOURNAMENT_TYPE -> {
val defaultValue: Any? by map val defaultValue: Any? by map
arrayListOf( arrayListOf(

Loading…
Cancel
Save