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 964144ed..7e3822e0 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 @@ -6,14 +6,13 @@ import io.realm.RealmObject 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.RowEditableDescriptor +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 { + RowRepresentableDataSource, RowRepresentable { companion object { fun newInstance() : Bankroll { @@ -57,24 +56,22 @@ open class Bankroll(name: String = "") : RealmObject(), Savable, 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 + BankrollRow.LIVE -> return this.live else -> return super.boolForRow(row) } } - 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 @@ -87,6 +84,8 @@ open class Bankroll(name: String = "") : RealmObject(), Savable, override fun updateValue(value: Any?, row: RowRepresentable) { when (row) { SimpleRow.NAME -> this.name = value as String? ?: "" + BankrollRow.LIVE -> this.live = value as Boolean? ?: false + } } 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 2bf0fa53..fe4f98f8 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 @@ -5,11 +5,11 @@ import io.realm.RealmObject 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.RowEditableDescriptor +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 +44,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 7e4f49a0..24d776a6 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 @@ -5,15 +5,14 @@ import io.realm.RealmObject 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.RowEditableDescriptor -import net.pokeranalytics.android.ui.view.RowEditable +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() @@ -49,11 +48,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 966c8c67..1fa92055 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,8 +14,7 @@ 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.RowEditableDescriptor -import net.pokeranalytics.android.ui.view.RowEditable +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 @@ -27,8 +26,7 @@ import java.util.* import kotlin.collections.ArrayList open class Session : RealmObject(), SessionInterface, Savable, - RowRepresentableDataSource, - RowEditable, RowRepresentable { + RowRepresentableDataSource, RowRepresentable { @PrimaryKey var id = UUID.randomUUID().toString() @@ -295,25 +293,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 ) @@ -321,7 +319,7 @@ open class Session : RealmObject(), SessionInterface, Savable, } SessionRow.CASHED_OUT -> { data.add( - RowEditableDescriptor( + RowRepresentableEditDescriptor( result?.cashout, inputType = InputType.TYPE_CLASS_NUMBER ) @@ -330,30 +328,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) ) @@ -362,7 +360,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) ) @@ -371,7 +369,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) ) @@ -379,14 +377,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 @@ -395,7 +393,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/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index 4b36646f..828c6673 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 @@ -5,14 +5,13 @@ import io.realm.RealmObject 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.RowEditableDescriptor -import net.pokeranalytics.android.ui.view.RowEditable +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() @@ -43,11 +42,11 @@ open class TournamentFeature : RealmObject(), Savable, RowRepresentableDataSourc } - 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/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index 0d1130c7..7338b9c8 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 @@ -5,15 +5,11 @@ import io.realm.RealmObject 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.RowEditableDescriptor -import net.pokeranalytics.android.ui.view.RowEditable -import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.SimpleRow -import net.pokeranalytics.android.ui.view.TransactionTypeRow +import net.pokeranalytics.android.ui.view.* import java.util.* -open class TransactionType : RealmObject(), Savable, RowRepresentableDataSource, RowEditable, RowRepresentable { +open class TransactionType : RealmObject(), Savable, RowRepresentableDataSource, RowRepresentable { @PrimaryKey var id = UUID.randomUUID().toString() @@ -52,11 +48,11 @@ open class TransactionType : RealmObject(), Savable, RowRepresentableDataSource, } } - 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/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 1eef93e2..9c2433d8 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 @@ -109,7 +109,7 @@ class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, return this.realmSessions.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 81c00890..ddab69b5 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 @@ -190,21 +190,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 } } @@ -212,7 +210,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 9cb810a3..77a995f4 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 @@ -9,18 +9,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) { + + } } @@ -31,6 +36,7 @@ enum class RowViewType { TITLE, TITLE_VALUE, TITLE_VALUE_ACTION, + TITLE_SWITCH, DATA, BOTTOM_SHEET_DATA, TITLE_GRID, @@ -38,76 +44,117 @@ 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?) { - itemView.sessionRow.setData(row as Session) - itemView.sessionRow.setOnClickListener(listener) + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + 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 @@ -116,7 +163,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) } } @@ -152,6 +205,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