diff --git a/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt b/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt index 34fd0667..4ecd4d71 100644 --- a/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt +++ b/app/src/androidTest/java/net/pokeranalytics/android/ExampleInstrumentedUnitTest.kt @@ -177,14 +177,14 @@ class ExampleInstrumentedUnitTest : RealmInstrumentedUnitTest() { val stdHourly = results.computedStat(Stat.STANDARD_DEVIATION_HOURLY) if (stdHourly != null) { - assertEquals(50.0, stdHourly.value, delta) + assertEquals(111.8, stdHourly.value, delta) } else { Assert.fail("No stdHourly stat") } val std100 = results.computedStat(Stat.STANDARD_DEVIATION_BB_PER_100_HANDS) if (std100 != null) { - assertEquals(250.0, std100.value, delta) + assertEquals(559.01, std100.value, delta) } else { Assert.fail("No std100 stat") } diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index c1a9ae52..e97973ff 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -194,8 +194,8 @@ class Calculator { // Session Set var hourlyStdSum: Double = 0.0 - sessionSets.forEach { sg -> - hourlyStdSum += Math.pow(sg.hourlyRate - hourlyRate, 2.0) + sessionSets.forEach { set -> + hourlyStdSum += Math.pow(set.hourlyRate - hourlyRate, 2.0) } val hourlyStandardDeviation: Double = Math.sqrt(hourlyStdSum / sessionSets.size) diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Savable.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Savable.kt index 7bc511bf..3cb63ed3 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Savable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Savable.kt @@ -1,5 +1,7 @@ package net.pokeranalytics.android.model.interfaces +import net.pokeranalytics.android.ui.view.RowRepresentable + /** * An interface to easily handle the validity of any object we want to save */ @@ -16,4 +18,11 @@ interface Savable { * A unique identifier getter */ fun uniqueIdentifier(): String + + + /** + * a method to handle the modification of the object. + * Through [RowRepresentable] the object is able to update the right variable with the new value. + */ + fun updateValue(value: Any?, row: RowRepresentable) } \ No newline at end of file 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 779e6379..a1fbc3f6 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 @@ -3,92 +3,91 @@ package net.pokeranalytics.android.model.realm import android.text.InputType import io.realm.RealmList import io.realm.RealmObject -import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.* import java.util.* import kotlin.collections.ArrayList open class Bankroll(name: String = "") : RealmObject(), Savable, - RowRepresentableDataSource, - RowEditable, RowRepresentable { - - companion object { - fun newInstance(): Bankroll { - var bankroll: Bankroll = Bankroll() - return bankroll - } - } - - @PrimaryKey - var id = UUID.randomUUID().toString() - - // the name of the bankroll - var name: String = name - - // Indicates whether the bankroll is live or online - var live: Boolean = true - - // The list of transactions of the bankroll - var transactions: RealmList = RealmList() - - // The currency of the bankroll - var currency: Currency? = null - - // @todo rate management - - override fun getDisplayName(): String { - return this.name - } - - override fun uniqueIdentifier(): String { - return this.id - } - - override fun adapterRows(): ArrayList { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(BankrollRow.values()) - return rows - } - - override fun stringForRow(row: RowRepresentable): String { - return when (row) { - SimpleRow.NAME -> this.name - BankrollRow.LIVE -> if (this.live) "live" else "online" - BankrollRow.CURRENCY -> this.currency?.code ?: "" - else -> return super.stringForRow(row) - } - } - - override fun boolForRow(row: RowRepresentable): Boolean { - when (row) { - BankrollRow.LIVE -> return true - else -> return super.boolForRow(row) - } - } - - override fun rowEditableDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() - when (row) { - SimpleRow.NAME -> data.add( - RowEditableDescriptor( - this.name, - SimpleRow.NAME.resId, - InputType.TYPE_CLASS_TEXT - ) - ) - } - return data - } - - override fun updateValue(value: Any?, row: RowRepresentable) { - when (row) { - SimpleRow.NAME -> this.name = value as String? ?: "" - } - } + RowRepresentableDataSource, RowRepresentable { + + companion object { + fun newInstance() : Bankroll { + var bankroll: Bankroll = Bankroll() + return bankroll + } + } + + @PrimaryKey + var id = UUID.randomUUID().toString() + + // the name of the bankroll + var name: String = name + + // Indicates whether the bankroll is live or online + var live: Boolean = true + + // The list of transactions of the bankroll + var transactions: RealmList = RealmList() + + // The currency of the bankroll + var currency: Currency? = null + + // @todo rate management + + override fun getDisplayName(): String { + return this.name + } + + override fun uniqueIdentifier(): String { + return this.id + } + + override fun adapterRows(): ArrayList { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(BankrollRow.values()) + return rows + } + + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> this.name + else -> return super.stringForRow(row) + } + } + + override fun boolForRow(row: RowRepresentable): Boolean { + when (row) { + BankrollRow.LIVE -> return this.live + else -> return super.boolForRow(row) + } + } + + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() + when (row) { + SimpleRow.NAME -> data.add( + RowRepresentableEditDescriptor( + this.name, + SimpleRow.NAME.resId, + InputType.TYPE_CLASS_TEXT + ) + ) + } + return data + } + + override fun updateValue(value: Any?, row: RowRepresentable) { + when (row) { + SimpleRow.NAME -> this.name = value as String? ?: "" + BankrollRow.LIVE -> this.live = value as Boolean? ?: false + + } + } override fun isValidForSave(): Boolean { return this.name.isNotEmpty() diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index c5ac2579..8090f1b8 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -6,10 +6,11 @@ import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.* import java.util.* -open class Game : RealmObject(), Savable, RowRepresentableDataSource, RowEditable, +open class Game : RealmObject(), Savable, RowRepresentableDataSource, RowRepresentable { @PrimaryKey @@ -44,18 +45,18 @@ open class Game : RealmObject(), Savable, RowRepresentableDataSource, RowEditabl } } - override fun rowEditableDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() when (row) { SimpleRow.NAME -> data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT ) ) GameRow.SHORT_NAME -> data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( this.shortName, GameRow.SHORT_NAME.resId, InputType.TYPE_CLASS_TEXT diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index 0e07dcea..bbb0cbb4 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -6,11 +6,14 @@ import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource -import net.pokeranalytics.android.ui.view.* +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor +import net.pokeranalytics.android.ui.view.LocationRow +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.SimpleRow import java.util.* -open class Location : RealmObject(), Savable, RowRepresentableDataSource, RowEditable, RowRepresentable { +open class Location : RealmObject(), Savable, RowRepresentableDataSource, RowRepresentable { @PrimaryKey var id = UUID.randomUUID().toString() @@ -46,11 +49,11 @@ open class Location : RealmObject(), Savable, RowRepresentableDataSource, RowEdi } } - override fun rowEditableDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() when (row) { SimpleRow.NAME -> data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT 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 c3038d2f..f2b915c9 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 @@ -14,21 +14,19 @@ import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource -import net.pokeranalytics.android.ui.view.RowEditable -import net.pokeranalytics.android.ui.view.RowEditableDescriptor +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.SessionRow import net.pokeranalytics.android.util.getDuration import net.pokeranalytics.android.util.round -import net.pokeranalytics.android.util.shortDateTime +import net.pokeranalytics.android.util.short import net.pokeranalytics.android.util.toCurrency import timber.log.Timber import java.util.* import kotlin.collections.ArrayList open class Session : RealmObject(), SessionInterface, Savable, - RowRepresentableDataSource, - RowEditable, RowRepresentable { + RowRepresentableDataSource, RowRepresentable { @PrimaryKey var id = UUID.randomUUID().toString() @@ -307,25 +305,25 @@ open class Session : RealmObject(), SessionInterface, Savable, } } - override fun rowEditableDescriptors(row: RowRepresentable): ArrayList { + override fun editDescriptors(row: RowRepresentable): ArrayList { - val data = ArrayList() + val data = ArrayList() when (row) { SessionRow.BUY_IN -> { // Add first & second buttons values, current value & set the 2 edit texts - data.add(RowEditableDescriptor(100.0 * (cgBigBlind ?: 0.0))) - data.add(RowEditableDescriptor(200.0 * (cgBigBlind ?: 0.0))) - data.add(RowEditableDescriptor(buyin)) + data.add(RowRepresentableEditDescriptor(100.0 * (cgBigBlind ?: 0.0))) + data.add(RowRepresentableEditDescriptor(200.0 * (cgBigBlind ?: 0.0))) + data.add(RowRepresentableEditDescriptor(buyin)) data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( "", inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL ) ) data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( "", inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL ) @@ -333,7 +331,7 @@ open class Session : RealmObject(), SessionInterface, Savable, } SessionRow.CASHED_OUT -> { data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( result?.cashout, inputType = InputType.TYPE_CLASS_NUMBER ) @@ -342,30 +340,30 @@ open class Session : RealmObject(), SessionInterface, Savable, SessionRow.TIPS -> { // Disable the buttons with value = 0, add current value & set the 2 edit texts // TODO: manage tips - data.add(RowEditableDescriptor(cgSmallBlind ?: 0.0)) - data.add(RowEditableDescriptor(cgBigBlind ?: 0.0)) - data.add(RowEditableDescriptor(0)) + data.add(RowRepresentableEditDescriptor(cgSmallBlind ?: 0.0)) + data.add(RowRepresentableEditDescriptor(cgBigBlind ?: 0.0)) + data.add(RowRepresentableEditDescriptor(0)) data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( "", inputType = InputType.TYPE_CLASS_NUMBER ) ) data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( "", inputType = InputType.TYPE_CLASS_NUMBER ) ) } SessionRow.TABLE_SIZE -> { - data.add(RowEditableDescriptor(tableSize)) + data.add(RowRepresentableEditDescriptor(tableSize)) } SessionRow.GAME -> { // Add current game & games list - data.add(RowEditableDescriptor(limit)) + data.add(RowRepresentableEditDescriptor(limit)) data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( game, data = LiveData.GAME.items(realm) ) @@ -374,7 +372,7 @@ open class Session : RealmObject(), SessionInterface, Savable, SessionRow.LOCATION -> { // Add current location and locations list data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( location, data = LiveData.LOCATION.items(realm) ) @@ -383,7 +381,7 @@ open class Session : RealmObject(), SessionInterface, Savable, SessionRow.BANKROLL -> { // Add current bankroll and bankrolls list data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( bankroll, data = LiveData.BANKROLL.items(realm) ) @@ -391,14 +389,14 @@ open class Session : RealmObject(), SessionInterface, Savable, } SessionRow.BLINDS -> { data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( cgSmallBlind, R.string.smallblind, InputType.TYPE_CLASS_NUMBER ) ) data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( cgBigBlind, R.string.bigblind, InputType.TYPE_CLASS_NUMBER @@ -407,7 +405,7 @@ open class Session : RealmObject(), SessionInterface, Savable, } SessionRow.COMMENT -> { data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( comment, R.string.comment, InputType.TYPE_CLASS_TEXT diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt index d05fad74..659787a8 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt @@ -41,6 +41,9 @@ open class SessionSet() : RealmObject() { @Ignore // a duration shortcut var hourlyRate: Double = 0.0 + get () { + return this.netResult / this.hourlyDuration + } @Ignore var estimatedHands: Double = 25.0 * (this.timeFrame?.hourlyDuration?.toDouble() ?: 0.0) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index 9a7001b7..6c974c20 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -6,59 +6,62 @@ import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource -import net.pokeranalytics.android.ui.view.* +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.SimpleRow +import net.pokeranalytics.android.ui.view.TournamentFeatureRow import java.util.* -open class TournamentFeature : RealmObject(), Savable, RowRepresentableDataSource, RowEditable, RowRepresentable { +open class TournamentFeature : RealmObject(), Savable, RowRepresentableDataSource, RowRepresentable { - @PrimaryKey - var id = UUID.randomUUID().toString() + @PrimaryKey + var id = UUID.randomUUID().toString() - // The name of the feature - var name: String = "" + // The name of the feature + var name: String = "" - override fun getDisplayName(): String { - return this.name - } + override fun getDisplayName(): String { + return this.name + } - override fun uniqueIdentifier(): String { - return this.id - } + override fun uniqueIdentifier(): String { + return this.id + } - override fun adapterRows(): ArrayList { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(TournamentFeatureRow.values()) - return rows - } + override fun adapterRows(): ArrayList { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(TournamentFeatureRow.values()) + return rows + } - override fun stringForRow(row: RowRepresentable): String { - return when (row) { - SimpleRow.NAME -> this.name - else -> return super.stringForRow(row) - } - } + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> this.name + else -> return super.stringForRow(row) + } + } - override fun rowEditableDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() - when (row) { - SimpleRow.NAME -> data.add( - RowEditableDescriptor( - this.name, - SimpleRow.NAME.resId, - InputType.TYPE_CLASS_TEXT - ) - ) - } - return data - } + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() + when (row) { + SimpleRow.NAME -> data.add( + RowRepresentableEditDescriptor( + this.name, + SimpleRow.NAME.resId, + InputType.TYPE_CLASS_TEXT + ) + ) + } + return data + } - override fun updateValue(value: Any?, row: RowRepresentable) { - when (row) { - SimpleRow.NAME -> this.name = value as String? ?: "" - } - } + override fun updateValue(value: Any?, row: RowRepresentable) { + when (row) { + SimpleRow.NAME -> this.name = value as String? ?: "" + } + } override fun isValidForSave(): Boolean { return this.name.isNotEmpty() diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index a6b92d33..3d0d8753 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt @@ -10,64 +10,64 @@ import net.pokeranalytics.android.ui.view.* import java.util.* -open class TransactionType : RealmObject(), Savable, RowRepresentableDataSource, RowEditable, RowRepresentable { - - @PrimaryKey - var id = UUID.randomUUID().toString() - - // The name of the transaction type - var name: String = "" - - // Whether or not the amount is added, or subtracted to the bankroll total - var additive: Boolean = false - - // Whether or not the type can be deleted by the user - var lock: Boolean = false - - // The predefined kind, if necessary, like: Withdrawal, deposit, or tips - var kind: Int? = null - - override fun getDisplayName(): String { - return this.name - } - - override fun uniqueIdentifier(): String { - return this.id - } - - override fun adapterRows(): ArrayList { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(TransactionTypeRow.values()) - return rows - } - - override fun stringForRow(row: RowRepresentable): String { - return when (row) { - SimpleRow.NAME -> this.name - else -> return super.stringForRow(row) - } - } - - override fun rowEditableDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() - when (row) { - SimpleRow.NAME -> data.add( - RowEditableDescriptor( - this.name, - SimpleRow.NAME.resId, - InputType.TYPE_CLASS_TEXT - ) - ) - } - return data - } - - override fun updateValue(value: Any?, row: RowRepresentable) { - when (row) { - SimpleRow.NAME -> this.name = value as String? ?: "" - } - } +open class TransactionType : RealmObject(), Savable, RowRepresentableDataSource, RowRepresentable { + + @PrimaryKey + var id = UUID.randomUUID().toString() + + // The name of the transaction type + var name: String = "" + + // Whether or not the amount is added, or subtracted to the bankroll total + var additive: Boolean = false + + // Whether or not the type can be deleted by the user + var lock: Boolean = false + + // The predefined kind, if necessary, like: Withdrawal, deposit, or tips + var kind: Int? = null + + override fun getDisplayName(): String { + return this.name + } + + override fun uniqueIdentifier(): String { + return this.id + } + + override fun adapterRows(): ArrayList { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(TransactionTypeRow.values()) + return rows + } + + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> this.name + else -> return super.stringForRow(row) + } + } + + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() + when (row) { + SimpleRow.NAME -> data.add( + RowRepresentableEditDescriptor( + this.name, + SimpleRow.NAME.resId, + InputType.TYPE_CLASS_TEXT + ) + ) + } + return data + } + + override fun updateValue(value: Any?, row: RowRepresentable) { + when (row) { + SimpleRow.NAME -> this.name = value as String? ?: "" + } + } override fun isValidForSave(): Boolean { return this.name.isNotEmpty() @@ -80,6 +80,6 @@ open class TransactionType : RealmObject(), Savable, RowRepresentableDataSource, } enum class TransactionKind { - WITHDRAWAL, - DEPOSIT + WITHDRAWAL, + DEPOSIT } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt index 5b13bd61..e9e61ae6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt @@ -1,10 +1,11 @@ package net.pokeranalytics.android.ui.adapter -import android.view.View +import android.os.Handler import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import net.pokeranalytics.android.ui.view.BindableHolder +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -28,10 +29,18 @@ interface RowRepresentableDataSource : DisplayableDataSource { fun indexForRow(row:RowRepresentable): Int { return this.adapterRows().indexOf(row) } + + /** + * A list of [RowRepresentableEditDescriptor] object specifying the way the edition will be handled + */ + fun editDescriptors(row: RowRepresentable): ArrayList { + return ArrayList() + } } -interface RowRepresentableDelegate : DisplayableDelegate { - fun onIndexSelected(position: Int) {} +interface RowRepresentableDelegate { + fun onRowSelected(position: Int, row: RowRepresentable, fromAction:Boolean = false) {} + fun onRowValueChanged(value: Any?, row: RowRepresentable) {} } /** @@ -77,14 +86,6 @@ interface DisplayableDataSource { * */ } -/** - * A delegate used to propagate UI actions - */ -interface DisplayableDelegate { - fun onRowSelected(row: RowRepresentable) {} - fun onActionSelected(row: RowRepresentable) {} -} - /** * An adapter capable of displaying a list of RowRepresentables * @param dataSource the datasource providing rows @@ -110,18 +111,8 @@ class RowRepresentableAdapter( } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - val dynamicRow = this.dataSource.rowRepresentableForPosition(position) - - val listener = View.OnClickListener { - delegate?.onRowSelected(dynamicRow) - delegate?.onIndexSelected(position) - } - - val actionListener = View.OnClickListener { - delegate?.onActionSelected(dynamicRow) - } - - (holder as BindableHolder).bind(dynamicRow, this.dataSource, listener, actionListener) + val rowRepresentable = this.dataSource.rowRepresentableForPosition(position) + (holder as BindableHolder).bind(position, rowRepresentable, this) } /** @@ -130,7 +121,11 @@ class RowRepresentableAdapter( fun refreshRow(row: RowRepresentable) { val index = this.dataSource.indexForRow(row) if (index >= 0) { - notifyItemChanged(index) + val handler = Handler() + + handler.post { + notifyItemChanged(index) + } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index bbe261f1..41adc617 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -53,7 +53,7 @@ class DataListFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, return this.items.indexOf(row) } - override fun onIndexSelected(position: Int) { + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { this.dataType.relatedResultsRepresentable?.let { EditableDataActivity.newInstance(requireContext(), it.ordinal, (this.items[position] as Savable).uniqueIdentifier()) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index ffe71634..4015aa47 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -18,7 +18,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment -import net.pokeranalytics.android.ui.view.RowEditable +import net.pokeranalytics.android.ui.view.BankrollRow import net.pokeranalytics.android.ui.view.RowRepresentable import timber.log.Timber @@ -55,27 +55,17 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, return true } - override fun onRowSelected(row: RowRepresentable) { - BottomSheetFragment.create(fragmentManager, row, this, (this.item as RowEditable).rowEditableDescriptors(row)) + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + BottomSheetFragment.create(fragmentManager, row,this, (this.item as RowRepresentableDataSource).editDescriptors(row)) } override fun clickOnAdd(row: RowRepresentable) { Toast.makeText(requireContext(), "Add new element: $row", Toast.LENGTH_SHORT).show() } - override fun clickOnClear(row: RowRepresentable) { - Toast.makeText(requireContext(), "Clear: $row", Toast.LENGTH_SHORT).show() + override fun onRowValueChanged(value: Any?, row: RowRepresentable) { this.getRealm().executeTransaction { - (this.item as RowEditable).updateValue(null, row) - it.copyToRealmOrUpdate(this.item) - } - rowRepresentableAdapter.refreshRow(row) - } - - override fun setValue(value: Any?, row: RowRepresentable) { - this.getRealm().executeTransaction { - (this.item as RowEditable).updateValue(value, row) - it.copyToRealmOrUpdate(this.item) + (this.item as Savable).updateValue(value, row) } rowRepresentableAdapter.refreshRow(row) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index 2ee7bd10..79ffaf32 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -144,7 +144,7 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, return this.sessions.indexOf(row) } - override fun onRowSelected(row: RowRepresentable) { + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { SessionActivity.newInstance(requireContext(), sessionId = (row as Savable).uniqueIdentifier()) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index 348e33aa..49144a9b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -66,8 +66,13 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott } - override fun onRowSelected(row: RowRepresentable) { - val data = currentSession.rowEditableDescriptors(row) + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + if (fromAction) { + Toast.makeText(requireContext(), "Action for row: $row", Toast.LENGTH_SHORT).show() + return + } + + val data = currentSession.editDescriptors(row) when (row) { SessionRow.START_DATE -> DateTimePickerManager.create( requireContext(), @@ -81,14 +86,10 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott this, currentSession.timeFrame?.endDate ) - else -> BottomSheetFragment.create(fragmentManager, row, this, data) + else -> BottomSheetFragment.create(fragmentManager, row,this, data) } } - override fun onActionSelected(row: RowRepresentable) { - Toast.makeText(requireContext(), "Action for row: $row", Toast.LENGTH_SHORT).show() - } - override fun clickOnAdd(row: RowRepresentable) { when (row) { SessionRow.GAME -> EditableDataActivity.newInstance(requireContext(), LiveData.GAME.ordinal) @@ -97,15 +98,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott } } - override fun clickOnClear(row: RowRepresentable) { - currentSession.updateValue(null, row) - sessionAdapter.refreshRow(row) - when (row) { - SessionRow.START_DATE, SessionRow.END_DATE -> updateSessionUI() - } - } - - override fun setValue(value: Any?, row: RowRepresentable) { + override fun onRowValueChanged(value: Any?, row: RowRepresentable) { currentSession.updateValue(value, row) sessionAdapter.refreshRow(row) when (row) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index 78e7aad0..1c70e275 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -49,7 +49,7 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, return rows } - override fun onRowSelected(row: RowRepresentable) { + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { DataListActivity.newInstance(requireContext(), (row as SettingRow).ordinal) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimePickerManager.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimePickerManager.kt index d3d2385d..e1336495 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimePickerManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimePickerManager.kt @@ -8,7 +8,7 @@ import android.text.format.DateFormat import android.widget.DatePicker import android.widget.TimePicker import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.view.RowRepresentable import java.util.* @@ -18,14 +18,14 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener, private var context: Context? = null lateinit var row: RowRepresentable - lateinit var bottomSheetDelegate: BottomSheetDelegate + lateinit var delegate: RowRepresentableDelegate lateinit var calendar: Calendar companion object { fun create( context: Context, row: RowRepresentable, - bottomSheetDelegate: BottomSheetDelegate, + delegate: RowRepresentableDelegate, date: Date? ) : DateTimePickerManager { @@ -35,7 +35,7 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener, val dateTimePickerManager = DateTimePickerManager() dateTimePickerManager.context = context dateTimePickerManager.row = row - dateTimePickerManager.bottomSheetDelegate = bottomSheetDelegate + dateTimePickerManager.delegate = delegate dateTimePickerManager.calendar = calendar dateTimePickerManager.showDatePicker() @@ -54,7 +54,7 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener, override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) { calendar.set(Calendar.HOUR_OF_DAY, hourOfDay) calendar.set(Calendar.MINUTE, minute) - bottomSheetDelegate.setValue(calendar.time, row) + delegate.onRowValueChanged(calendar.time, row) } /** @@ -67,7 +67,7 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener, context?.let { val datePickerDialog = DatePickerDialog(it, this, year, month, day) datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, it.getString(R.string.clear)) { dialog, _ -> - bottomSheetDelegate.clickOnClear(row) + delegate.onRowValueChanged(null, row) dialog.dismiss() } datePickerDialog.show() @@ -83,7 +83,7 @@ class DateTimePickerManager : DatePickerDialog.OnDateSetListener, context?.let { val timePickerDialog = TimePickerDialog(context, this, hour, minute, DateFormat.is24HourFormat(context)) timePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, it.getString(R.string.clear)) { dialog, _ -> - bottomSheetDelegate.clickOnClear(row) + delegate.onRowValueChanged(null, row) dialog.dismiss() } timePickerDialog.show() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt index 066693d8..f54c281d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt @@ -63,7 +63,7 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { editText2.setOnEditorActionListener { v, actionId, event -> if (actionId == EditorInfo.IME_ACTION_DONE) { - bottomSheetDelegate.setValue(values, row) + this.delegate.onRowValueChanged(values, row) dismiss() true } else { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt index b9fdb024..b182c79b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt @@ -56,7 +56,7 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { editText1.setOnEditorActionListener { v, actionId, event -> if (actionId == EditorInfo.IME_ACTION_DONE) { - bottomSheetDelegate.setValue(value, row) + delegate.onRowValueChanged(value, row) dismiss() true } else { 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 197e2125..60de48ba 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 @@ -9,7 +9,8 @@ import androidx.fragment.app.FragmentManager import com.google.android.material.bottomsheet.BottomSheetDialogFragment import kotlinx.android.synthetic.main.fragment_bottom_sheet.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.view.RowEditableDescriptor +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentable enum class BottomSheetType { @@ -23,25 +24,26 @@ enum class BottomSheetType { SUM } -interface BottomSheetDelegate { - fun clickOnAdd(row: RowRepresentable) - fun clickOnClear(row: RowRepresentable) - fun setValue(value: Any?, row: RowRepresentable) +interface BottomSheetDelegate : RowRepresentableDelegate { + fun clickOnAdd(row: RowRepresentable) {} + fun clickOnClear(row: RowRepresentable) { + this.onRowValueChanged(null, row) + } } open class BottomSheetFragment : BottomSheetDialogFragment() { lateinit var row: RowRepresentable - lateinit var bottomSheetDelegate: BottomSheetDelegate + lateinit var delegate: BottomSheetDelegate - private var data: ArrayList = ArrayList() + private var rowRepresentableEditDescriptors: ArrayList = ArrayList() companion object { fun create( fragmentManager: FragmentManager?, row: RowRepresentable, - bottomSheetDelegate: BottomSheetDelegate, - data: ArrayList + delegate: BottomSheetDelegate, + rowRepresentableEditDescriptors: ArrayList ): BottomSheetFragment { val bottomSheetFragment = when (row.bottomSheetType) { @@ -57,8 +59,8 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { bottomSheetFragment.show(fragmentManager, "bottomSheet") bottomSheetFragment.row = row - bottomSheetFragment.bottomSheetDelegate = bottomSheetDelegate - bottomSheetFragment.data = data + bottomSheetFragment.delegate = delegate + bottomSheetFragment.rowRepresentableEditDescriptors = rowRepresentableEditDescriptors return bottomSheetFragment } } @@ -93,16 +95,16 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { // Menu bottomSheetToolbar.menu.findItem(R.id.actionClear).setOnMenuItemClickListener { - bottomSheetDelegate.clickOnClear(row) + this.delegate.clickOnClear(row) dismiss() true } bottomSheetToolbar.menu.findItem(R.id.actionAdd).setOnMenuItemClickListener { - bottomSheetDelegate.clickOnAdd(row) + this.delegate.clickOnAdd(row) true } bottomSheetToolbar.menu.findItem(R.id.actionCheck).setOnMenuItemClickListener { - bottomSheetDelegate.setValue(getValue(), row) + this.delegate.onRowValueChanged(getValue(), row) dismiss() true } @@ -112,8 +114,8 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { /** * Return the data list */ - fun getData(): ArrayList { - return data + fun getData(): ArrayList { + return this.rowRepresentableEditDescriptors } open fun getValue(): Any? { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt index 44558220..dd00822f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt @@ -56,15 +56,15 @@ class BottomSheetListFragment : BottomSheetFragment(), RowRepresentableDataSourc return super.indexForRow(row) } - override fun onIndexSelected(position: Int) { + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { realmData?.let { val selectedData = it[position] selectedData?.let {data -> - bottomSheetDelegate.setValue(data, row) + this.delegate.onRowValueChanged(data, row) dismiss() } } - super.onIndexSelected(position) + super.onRowSelected(position, row, fromAction) } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt index da42f45c..57129a3a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt @@ -66,16 +66,16 @@ class BottomSheetListGameFragment : BottomSheetFragment(), return super.indexForRow(row) } - override fun onIndexSelected(position: Int) { + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { realmData?.let { val selectedData = it[position] selectedData?.let { data -> values[1] = data - bottomSheetDelegate.setValue(values, row) + this.delegate.onRowValueChanged(data, row) dismiss() } } - super.onIndexSelected(position) + super.onRowSelected(position, row, fromAction) } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt index b1e5ca3e..abddc0bb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt @@ -70,7 +70,7 @@ class BottomSheetSumFragment : BottomSheetFragment() { button1.text = defaultValue1.toCurrency() button1.visibility = if (defaultValue1 > 0) View.VISIBLE else View.GONE button1.setOnClickListener { - bottomSheetDelegate.setValue(currentDefaultValue + defaultValue1, row) + this.delegate.onRowValueChanged(data, row) dismiss() } @@ -84,7 +84,7 @@ class BottomSheetSumFragment : BottomSheetFragment() { button2.text = defaultValue2.toCurrency() button2.visibility = if (defaultValue2 > 0) View.VISIBLE else View.GONE button2.setOnClickListener { - bottomSheetDelegate.setValue(currentDefaultValue + defaultValue2, row) + this.delegate.onRowValueChanged(data, row) dismiss() } @@ -110,7 +110,7 @@ class BottomSheetSumFragment : BottomSheetFragment() { editText2.setOnEditorActionListener { v, actionId, event -> if (actionId == EditorInfo.IME_ACTION_DONE) { - bottomSheetDelegate.setValue(value, row) + this.delegate.onRowValueChanged(data, row) dismiss() true } else { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt index f97c8acf..43508ed7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt @@ -84,8 +84,8 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), return TableSize.all.size } - override fun onRowSelected(row: RowRepresentable) { - bottomSheetDelegate.setValue((this.row as TableSize).numberOfPlayer, this.row) + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + this.delegate.onRowValueChanged((this.row as TableSize).numberOfPlayer, row) dismiss() } @@ -149,7 +149,7 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment() { val viewManager = GridLayoutManager(requireContext(), 3) dataAdapter = TableSizeGridAdapter(dataList) dataAdapter.onClickOnItem = { position -> - bottomSheetDelegate.setValue(position + 2, row) + bottomSheetDelegate.onRowValueChangedFromBottomSheet(position + 2, row) dismiss() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowEditable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowEditable.kt deleted file mode 100644 index a91fb0ca..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowEditable.kt +++ /dev/null @@ -1,30 +0,0 @@ -package net.pokeranalytics.android.ui.view - -import android.text.InputType -import io.realm.RealmResults - -/** -* An interface to describe how an object can be editable and to handle the update of the object -*/ -interface RowEditable { - /** - * A list of [RowEditableDescriptor] object specifying the way the edition will be handled - */ - fun rowEditableDescriptors(row: RowRepresentable): ArrayList - - /** - * a method to handle the modification of the object. - * Through [RowRepresentable] the object is able to update the right variable with the new value. - */ - fun updateValue(value: Any?, row: RowRepresentable) -} - -/** - * An container class to describe the way an field of an object will be edited - */ -class RowEditableDescriptor( - var defaultValue: Any? = null, - var hint: Int? = null, - var inputType: Int? = InputType.TYPE_CLASS_TEXT, - var data: RealmResults<*>? = null -) \ No newline at end of file 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 0d0cfb0a..cb99a104 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 @@ -199,21 +199,19 @@ enum class SimpleRow : RowRepresentable { } enum class BankrollRow : RowRepresentable { - LIVE, - CURRENCY; + LIVE; override val resId: Int? get() { return when (this) { LIVE -> R.string.live - CURRENCY -> R.string.currency } } override val viewType: Int get() { return when (this) { - LIVE, CURRENCY -> RowViewType.TITLE_VALUE.ordinal + LIVE -> RowViewType.TITLE_SWITCH.ordinal } } @@ -221,7 +219,6 @@ enum class BankrollRow : RowRepresentable { get() { return when (this) { LIVE -> BottomSheetType.NONE - CURRENCY -> BottomSheetType.LIST } } 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 new file mode 100644 index 00000000..d9fb8fd8 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentableEditDescriptor.kt @@ -0,0 +1,14 @@ +package net.pokeranalytics.android.ui.view + +import android.text.InputType +import io.realm.RealmResults + +/** + * An container class to describe the way an field of an object will be edited + */ +class RowRepresentableEditDescriptor( + var defaultValue: Any? = null, + var hint: Int? = null, + var inputType: Int? = InputType.TYPE_CLASS_TEXT, + var data: RealmResults<*>? = null +) \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 27b1acf6..e2072145 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -10,18 +10,23 @@ import kotlinx.android.synthetic.main.row_bottom_sheet_title.view.* import kotlinx.android.synthetic.main.row_header_title_value.view.* import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_title.view.* +import kotlinx.android.synthetic.main.row_title_switch.view.* import kotlinx.android.synthetic.main.row_title_value.view.* import kotlinx.android.synthetic.main.row_title_value_action.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate /** * An interface used to factor the configuration of RecyclerView.ViewHolder */ interface BindableHolder { - fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource? = null, listener: View.OnClickListener, actionListener: View.OnClickListener? = null) {} + fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + + } } @@ -32,6 +37,7 @@ enum class RowViewType { TITLE, TITLE_VALUE, TITLE_VALUE_ACTION, + TITLE_SWITCH, DATA, BOTTOM_SHEET_DATA, TITLE_GRID, @@ -39,13 +45,14 @@ enum class RowViewType { inner class FakeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { } } inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { if (row.displayHeader) { itemView.sessionHeader.isVisible = true @@ -55,68 +62,111 @@ enum class RowViewType { } itemView.sessionRow.setData(row as Session) + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } itemView.sessionRow.setOnClickListener(listener) + } + } inner class CellSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.title.text = row.localizedTitle(itemView.context) - itemView.container.setOnClickListener(listener) + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.container.setOnClickListener(listener) } } inner class DataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowTitle_title.text = row.getDisplayName() + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } itemView.rowTitle_container.setOnClickListener(listener) } } inner class BottomSheetDataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowBottomSheet_title.text = row.getDisplayName() + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } itemView.rowBottomSheet_container.setOnClickListener(listener) } } inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowTitle_title.text = row.localizedTitle(itemView.context) - itemView.rowTitle_container.setOnClickListener(listener) + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.rowTitle_container.setOnClickListener(listener) } } inner class HeaderTitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowHeaderTitleValue_title.text = row.localizedTitle(itemView.context) - rowRepresentableDataSource?.let { + adapter.dataSource?.let { itemView.rowHeaderTitleValue_value.text = it.stringForRow(row) } - itemView.rowHeaderTitleValue_container.setOnClickListener(listener) + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.rowHeaderTitleValue_container.setOnClickListener(listener) itemView.rowHeaderTitleValue_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE } } inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowTitleValue_title.text = row.localizedTitle(itemView.context) - rowRepresentableDataSource?.let { + adapter.dataSource?.let { itemView.rowTitleValue_value.text = it.stringForRow(row) } - itemView.rowTitleValue_container.setOnClickListener(listener) + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.rowTitleValue_container.setOnClickListener(listener) itemView.rowTitleValue_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE } } + inner class TitleSwitchViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + itemView.rowTitleSwitch_title.text = row.localizedTitle(itemView.context) + adapter.dataSource.let { + itemView.rowTitleSwitch_switch.isChecked = it.boolForRow(row) + itemView.rowTitleSwitch_switch.setOnCheckedChangeListener { _, b -> + adapter.delegate?.onRowValueChanged(b, row) + } + } + + val listener = View.OnClickListener { + itemView.rowTitleSwitch_switch.isChecked = !itemView.rowTitleSwitch_switch.isChecked + adapter.delegate?.onRowValueChanged(itemView.rowTitleSwitch_switch.isChecked, row) + } + itemView.rowTitleSwitch_container.setOnClickListener(listener) + itemView.rowTitleSwitch_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE + } + } + inner class TitleValueActionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { - override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowTitleValueAction_title.text = row.localizedTitle(itemView.context) - rowRepresentableDataSource?.let { rowDelegate -> + adapter.dataSource?.let { rowDelegate -> val value = rowDelegate.stringForRow(row) itemView.rowTitleValueAction_value.text = value @@ -125,7 +175,13 @@ enum class RowViewType { itemView.rowTitleValueAction_action.setImageResource(icon) } } - itemView.rowTitleValueAction_container.setOnClickListener(listener) + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + val actionListener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row, true) + } + itemView.rowTitleValueAction_container.setOnClickListener(listener) itemView.rowTitleValueAction_action.setOnClickListener(actionListener) } } @@ -161,6 +217,13 @@ enum class RowViewType { false ) ) + TITLE_SWITCH -> TitleSwitchViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_title_switch, + parent, + false + ) + ) DATA -> DataViewHolder( LayoutInflater.from(parent.context).inflate( R.layout.row_title, diff --git a/app/src/main/res/layout/row_title_switch.xml b/app/src/main/res/layout/row_title_switch.xml new file mode 100644 index 00000000..e6e99a71 --- /dev/null +++ b/app/src/main/res/layout/row_title_switch.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file