From ea99385835fce7d31bdfddf112ef392f63de5a9f Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 24 Sep 2019 12:16:59 +0200 Subject: [PATCH] Refactoring of bottom sheet to introduce the use of a ViewModel --- .../BottomSheetDoubleEditTextFragment.kt | 57 ++-- .../BottomSheetEditTextFragment.kt | 33 +-- .../BottomSheetEditTextMultiLinesFragment.kt | 20 +- .../bottomsheet/BottomSheetFragment.kt | 128 +++++---- .../bottomsheet/BottomSheetListFragment.kt | 50 ++-- .../BottomSheetListGameFragment.kt | 42 +-- .../BottomSheetMultiSelectionFragment.kt | 36 +-- .../BottomSheetNumericTextFragment.kt | 25 +- .../BottomSheetStaticListFragment.kt | 32 +-- .../bottomsheet/BottomSheetSumFragment.kt | 53 ++-- .../BottomSheetTableSizeGridFragment.kt | 30 +-- .../ui/viewmodel/BottomSheetViewModel.kt | 251 ++++++++++++++++++ 12 files changed, 447 insertions(+), 310 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/viewmodel/BottomSheetViewModel.kt 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 e16ab1b6..cc039a2a 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 @@ -10,15 +10,11 @@ import kotlinx.android.synthetic.main.bottom_sheet_double_edit_text.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException -import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.util.extensions.round class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { - private val values = ArrayList() - private var isEditingBlinds: Boolean = false - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initData() @@ -27,66 +23,72 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { override fun onStart() { super.onStart() - if (isEditingBlinds) { + if (this.viewModel.isEditingBlinds) { editText2.requestFocus() } else { editText.requestFocus() } } - override fun getValue(): Any? { - if (values.isEmpty()) { return null } - if (values.all { it.isEmpty() }) { return null } - return values - } - /** * Init data */ private fun initData() { - isEditingBlinds = row == SessionRow.BLINDS +// this.viewModel.isEditingBlinds = this.viewModel.row == SessionRow.BLINDS } /** * Init UI */ private fun initUI() { - val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + + val data = getDescriptors()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") if (data.size != 2) { throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } - values.add(0, "") - values.add(1, "") +// values.add(0, "") +// values.add(1, "") LayoutInflater.from(requireContext()) .inflate(R.layout.bottom_sheet_double_edit_text, view?.bottomSheetContainer, true) - values[0] = (data[0].defaultValue ?: "").toString() - values[1] = (data[1].defaultValue ?: "").toString() +// values[0] = (data[0].defaultValue ?: "").toString() +// values[1] = (data[1].defaultValue ?: "").toString() data[0].hint?.let { editText.hint = getString(it) } editText.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES data[1].hint?.let { editText2.hint = getString(it) } editText2.inputType = data[1].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES - if (valueHasPlaceholder) { - if (values[0].isNotBlank()) { editText.hint = values[0] } - if (values[1].isNotBlank()) { editText2.hint = values[1] } + if (this.viewModel.valueAsPlaceholder) { + + this.viewModel.stringValue?.let { + if (it.isNotBlank()) { + editText.hint = it + } + } + this.viewModel.secondStringValue?.let { + if (it.isNotBlank()) { + editText2.hint = it + } + } +// if (this.viewModel.stringValue?.isNotBlank()) { editText.hint = values[0] } +// if (values[1].isNotBlank()) { editText2.hint = values[1] } } else { - editText.setText(values[0]) - editText2.setText(values[1]) + editText.setText(this.viewModel.stringValue) + editText2.setText(this.viewModel.secondStringValue) } editText.addTextChangedListener { - values[0] = it?.toString() ?: "" + this.viewModel.stringValue = it?.toString() } editText2.addTextChangedListener { - values[1] = it?.toString() ?: "" - if (isEditingBlinds) { + this.viewModel.secondStringValue = it?.toString() + if (this.viewModel.isEditingBlinds) { try { - val bigBlind = values[1].toDouble() + val bigBlind = this.viewModel.secondStringValue?.toDouble() ?: 0.0 editText.setText((bigBlind / 2.0).round()) } catch (e: Exception) { editText.setText("") @@ -97,7 +99,8 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { editText2.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { - this.delegate.onRowValueChanged(values, row) + this.viewModel.onRowValueChanged() +// 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 2581a9ac..7e1312bf 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 @@ -10,16 +10,12 @@ import kotlinx.android.synthetic.main.bottom_sheet_edit_text.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException -import net.pokeranalytics.android.ui.view.RowRepresentable class BottomSheetEditTextFragment : BottomSheetFragment() { - private var value: String? = null - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() initUI() } @@ -28,30 +24,12 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { editText.requestFocus() } - override fun getValue(): Any? { - this.value?.let { - val value = it.trim() - if (value.isEmpty()) { // avoid returning empty strings - return null - } else { - return value - } - } - return null - } - - /** - * Init data - */ - private fun initData() { - } - /** * Init UI */ private fun initUI() { - val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + val data = getDescriptors() ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") if (data.size != 1) { throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } @@ -61,11 +39,11 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { data[0].hint?.let { editText.hint = getString(it) } editText.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES editText.addTextChangedListener { - this.value = it?.toString() + this.viewModel.stringValue = it?.toString() } data[0].defaultValue?.let { - if (valueHasPlaceholder) { - this.value = it.toString() + if (this.viewModel.valueAsPlaceholder) { + this.viewModel.stringValue = it.toString() editText.hint = it.toString() } else { editText.setText(it.toString()) @@ -74,7 +52,8 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { editText.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { - delegate.onRowValueChanged(getValue(), row) + this.viewModel.onRowValueChanged() +// delegate.onRowValueChanged(getValue(), row) dismiss() true } else { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt index 22f450be..b3410d24 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt @@ -12,11 +12,8 @@ import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorExcep class BottomSheetEditTextMultiLinesFragment : BottomSheetFragment() { - private var value: String? = null - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() initUI() } @@ -25,24 +22,11 @@ class BottomSheetEditTextMultiLinesFragment : BottomSheetFragment() { editText.requestFocus() } - override fun getValue(): Any? { - this.value?.let { - return it.trim() - } - return null - } - - /** - * Init data - */ - private fun initData() { - } - /** * Init UI */ private fun initUI() { - val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + val data = getDescriptors()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") if (data.size != 1) { throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } @@ -51,7 +35,7 @@ class BottomSheetEditTextMultiLinesFragment : BottomSheetFragment() { data[0].hint?.let { editText.hint = getString(it) } editText.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES - editText.addTextChangedListener { this.value = it?.toString() } + editText.addTextChangedListener { this.viewModel.stringValue = it?.toString() } data[0].defaultValue?.let { editText.setText(it.toString()) } 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 90f2411f..000924b8 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 @@ -11,9 +11,8 @@ import android.view.ViewGroup import android.view.WindowManager import androidx.appcompat.view.ContextThemeWrapper import androidx.fragment.app.FragmentManager -import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProviders import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import io.realm.RealmModel import kotlinx.android.synthetic.main.fragment_bottom_sheet.* import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException @@ -25,65 +24,32 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.ui.view.rowrepresentable.TransactionRow +import net.pokeranalytics.android.ui.viewmodel.BottomSheetViewModel import java.util.* -class BottomSheetViewModel(var row: RowRepresentable, - var delegate: RowRepresentableDelegate, - var currentCurrency: Currency? = null, - var valueHasPlaceholder: Boolean = false, - var isClearable: Boolean = true, - var isDeletable: Boolean = false, - var rowRepresentableEditDescriptors: ArrayList? = null) - : ViewModel() { - -} open class BottomSheetFragment : BottomSheetDialogFragment() { - lateinit var row: RowRepresentable + /** + * A view model used to store potential bottom sheet values + */ + protected val viewModel: BottomSheetViewModel by lazy { + ViewModelProviders.of(this).get(BottomSheetViewModel::class.java) + } - lateinit var delegate: RowRepresentableDelegate + var row: RowRepresentable? = null + var delegate: RowRepresentableDelegate? = null var currentCurrency: Currency? = null - var valueHasPlaceholder: Boolean = false + var valueAsPlaceholder: Boolean = false private var isClearable: Boolean = true private var isDeletable: Boolean = false private var rowRepresentableEditDescriptors: ArrayList? = null - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - - - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - - - - } - companion object { const val REQUEST_CODE_ADD_NEW_OBJECT = 100 - private fun newInstance(bottomSheetType: BottomSheetType): BottomSheetFragment { - return when (bottomSheetType) { - BottomSheetType.NONE -> BottomSheetFragment() - BottomSheetType.LIST -> BottomSheetListFragment() - BottomSheetType.LIST_STATIC -> BottomSheetStaticListFragment() - BottomSheetType.LIST_GAME -> BottomSheetListGameFragment() - BottomSheetType.DOUBLE_LIST -> BottomSheetListGameFragment() - BottomSheetType.MULTI_SELECTION -> BottomSheetMultiSelectionFragment() - BottomSheetType.GRID -> BottomSheetTableSizeGridFragment() - BottomSheetType.EDIT_TEXT -> BottomSheetEditTextFragment() - BottomSheetType.EDIT_TEXT_MULTI_LINES -> BottomSheetEditTextMultiLinesFragment() - BottomSheetType.DOUBLE_EDIT_TEXT -> BottomSheetDoubleEditTextFragment() - BottomSheetType.NUMERIC_TEXT -> BottomSheetNumericTextFragment() - BottomSheetType.SUM -> BottomSheetSumFragment() - } - } - fun create( fragmentManager: FragmentManager?, row: RowRepresentable, @@ -96,15 +62,52 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { ): BottomSheetFragment { val bottomSheetFragment = newInstance(row.bottomSheetType) bottomSheetFragment.show(fragmentManager, "bottomSheet") +// bottomSheetFragment.configure(row, delegate, rowRepresentableEditDescriptors, isClearable, currentCurrency, isDeletable, valueHasPlaceholder) bottomSheetFragment.row = row bottomSheetFragment.delegate = delegate bottomSheetFragment.rowRepresentableEditDescriptors = rowRepresentableEditDescriptors bottomSheetFragment.isClearable = isClearable ?: true bottomSheetFragment.isDeletable = isDeletable ?: true - bottomSheetFragment.valueHasPlaceholder = valueHasPlaceholder ?: true + bottomSheetFragment.valueAsPlaceholder = valueHasPlaceholder ?: true bottomSheetFragment.currentCurrency = currentCurrency return bottomSheetFragment } + + private fun newInstance(bottomSheetType: BottomSheetType): BottomSheetFragment { + return when (bottomSheetType) { + BottomSheetType.NONE -> BottomSheetFragment() + BottomSheetType.LIST -> BottomSheetListFragment() + BottomSheetType.LIST_STATIC -> BottomSheetStaticListFragment() + BottomSheetType.LIST_GAME -> BottomSheetListGameFragment() + BottomSheetType.DOUBLE_LIST -> BottomSheetListGameFragment() + BottomSheetType.MULTI_SELECTION -> BottomSheetMultiSelectionFragment() + BottomSheetType.GRID -> BottomSheetTableSizeGridFragment() + BottomSheetType.EDIT_TEXT -> BottomSheetEditTextFragment() + BottomSheetType.EDIT_TEXT_MULTI_LINES -> BottomSheetEditTextMultiLinesFragment() + BottomSheetType.DOUBLE_EDIT_TEXT -> BottomSheetDoubleEditTextFragment() + BottomSheetType.NUMERIC_TEXT -> BottomSheetNumericTextFragment() + BottomSheetType.SUM -> BottomSheetSumFragment() + } + } + + } + + private fun configure(row: RowRepresentable, + delegate: RowRepresentableDelegate, + rowRepresentableEditDescriptors: ArrayList?, + isClearable: Boolean? = true, + currentCurrency: Currency? = null, + isDeletable: Boolean? = false, + valueHasPlaceholder: Boolean? = null) { + + this.viewModel.row = row + this.viewModel.delegate = delegate + this.viewModel.rowRepresentableEditDescriptors = rowRepresentableEditDescriptors + this.viewModel.isClearable = isClearable ?: true + this.viewModel.currentCurrency = currentCurrency + this.viewModel.isDeletable = isDeletable ?: false + this.viewModel.valueAsPlaceholder = valueHasPlaceholder ?: false + } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -115,21 +118,24 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + this.configure(this.row!!, this.delegate!!, this.rowRepresentableEditDescriptors, this.isClearable, this.currentCurrency, this.isDeletable, this.valueAsPlaceholder) + this.viewModel.load() initUI() } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - // If we come from a creation of an object an everything is okay, we call + // If we come from a creation of an object and everything is okay, we call // the delegate onRowValueChanged with the newly created object if (requestCode == REQUEST_CODE_ADD_NEW_OBJECT && resultCode == RESULT_OK && data != null) { val dataType = data.getIntExtra(EditableDataActivity.IntentKey.DATA_TYPE.keyName, 0) val primaryKey = data.getStringExtra(EditableDataActivity.IntentKey.PRIMARY_KEY.keyName) val pokerAnalyticsActivity = activity as PokerAnalyticsActivity val liveDataType = LiveData.values()[dataType] - val proxyItem: RealmModel? = liveDataType.getData(pokerAnalyticsActivity.getRealm(), primaryKey) - this.delegate.onRowValueChanged(proxyItem, this.row) + this.viewModel.addedData = liveDataType.getData(pokerAnalyticsActivity.getRealm(), primaryKey) + this.viewModel.onRowValueChanged() +// this.delegate.onRowValueChanged(proxyItem, this.row) dismiss() } } @@ -145,6 +151,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { */ private fun initUI() { + val row = this.viewModel.row bottomSheetToolbar.title = row.localizedTitle(requireContext()) bottomSheetToolbar.inflateMenu(R.menu.toolbar_bottom_sheet) bottomSheetToolbar.setOnMenuItemClickListener { @@ -156,13 +163,15 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { // Menu bottomSheetToolbar.menu.findItem(R.id.actionClear).setOnMenuItemClickListener { - delegate.onRowValueChanged(null, row) + this.viewModel.onClear() +// delegate.onRowValueChanged(null, row) dismiss() true } bottomSheetToolbar.menu.findItem(R.id.actionDelete).setOnMenuItemClickListener { - delegate.onRowDeleted(row) + this.viewModel.onRowDeleted() +// delegate.onRowDeleted(row) dismiss() true } @@ -175,7 +184,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { SessionRow.TOURNAMENT_NAME -> LiveData.TOURNAMENT_NAME SessionRow.TOURNAMENT_FEATURE -> LiveData.TOURNAMENT_FEATURE TransactionRow.TYPE -> LiveData.TRANSACTION_TYPE - else -> throw PAIllegalStateException("row $row does not have an associated LiveData value") + else -> throw PAIllegalStateException("row $it does not have an associated LiveData value") } EditableDataActivity.newInstanceForResult( @@ -187,25 +196,26 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { true } bottomSheetToolbar.menu.findItem(R.id.actionCheck).setOnMenuItemClickListener { - this.delegate.onRowValueChanged(getValue(), row) + this.viewModel.onRowValueChanged() +// this.delegate.onRowValueChanged(getValue(), row) dismiss() true } - bottomSheetToolbar.menu.findItem(R.id.actionClear).isVisible = isClearable - bottomSheetToolbar.menu.findItem(R.id.actionDelete).isVisible = isDeletable + bottomSheetToolbar.menu.findItem(R.id.actionClear).isVisible = this.viewModel.isClearable + bottomSheetToolbar.menu.findItem(R.id.actionDelete).isVisible = this.viewModel.isDeletable } /** * Return the data list */ - fun getData(): ArrayList? { - return this.rowRepresentableEditDescriptors + fun getDescriptors(): ArrayList? { + return this.viewModel.rowRepresentableEditDescriptors } - open fun getValue(): Any? { - return null + private fun getValue(): Any? { + return this.viewModel.getValue() } } \ No newline at end of file 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 fa5997f7..2526d20e 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 @@ -4,12 +4,10 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import androidx.recyclerview.widget.LinearLayoutManager -import io.realm.RealmResults import kotlinx.android.synthetic.main.bottom_sheet_list.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException -import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -18,11 +16,8 @@ import net.pokeranalytics.android.ui.view.RowViewType open class BottomSheetListFragment : BottomSheetFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { - lateinit var dataAdapter: RowRepresentableAdapter - var realmData: RealmResults? = null - override fun adapterRows(): List? { - return this.realmData + return this.viewModel.realmData } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -33,18 +28,18 @@ open class BottomSheetListFragment : BottomSheetFragment(), LiveRowRepresentable override fun onResume() { super.onResume() - dataAdapter.notifyDataSetChanged() + this.viewModel.notifyDataSetChanged() } override fun rowRepresentableForPosition(position: Int): RowRepresentable? { - realmData?.let { + this.viewModel.realmData?.let { return it[position] as RowRepresentable } throw PAIllegalStateException("Need to implement Data Source") } override fun numberOfRows(): Int { - realmData?.let { + this.viewModel.realmData?.let { return it.size } throw PAIllegalStateException("Need to implement Data Source") @@ -55,13 +50,17 @@ open class BottomSheetListFragment : BottomSheetFragment(), LiveRowRepresentable } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - realmData?.let { - val selectedData = it[position] - selectedData?.let {data -> - this.delegate.onRowValueChanged(data, this.row) - dismiss() - } - } + + this.viewModel.onRowSelected(position) + dismiss() +// this.viewModel.realmData?.let { +// val selectedData = it[position] +// selectedData?.let {data -> +// this.viewModel.onRowValueChanged(data) +//// this.delegate.onRowValueChanged(data, this.row) +// dismiss() +// } +// } super.onRowSelected(position, row, fromAction) } @@ -69,14 +68,14 @@ open class BottomSheetListFragment : BottomSheetFragment(), LiveRowRepresentable * Init data */ open fun initData() { - val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") - if (bottomSheetData.size != 1) { - throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") - } - if (bottomSheetData.first().data == null) { - throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") - } - this.realmData = bottomSheetData.first().data as RealmResults +// val bottomSheetData = getDescriptors() ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") +// if (bottomSheetData.size != 1) { +// throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") +// } +// if (bottomSheetData.first().data == null) { +// throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") +// } +// this.viewModel.realmData = bottomSheetData.first().data as RealmResults } /** @@ -86,7 +85,8 @@ open class BottomSheetListFragment : BottomSheetFragment(), LiveRowRepresentable LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_list, view?.bottomSheetContainer, true) val viewManager = LinearLayoutManager(requireContext()) - dataAdapter = RowRepresentableAdapter(this, this) + val dataAdapter = RowRepresentableAdapter(this, this) + this.viewModel.dataAdapter = dataAdapter reyclerView.apply { setHasFixedSize(true) 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 9c3b7ca8..4b025bbe 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 @@ -9,7 +9,6 @@ import com.google.android.material.chip.Chip import kotlinx.android.synthetic.main.bottom_sheet_game_list.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.extensions.px @@ -21,53 +20,33 @@ import net.pokeranalytics.android.ui.view.RowRepresentable */ class BottomSheetListGameFragment : BottomSheetListFragment() { - private var limit: Int? = 0 - private val values = ArrayList() - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() initUI() } - override fun getValue(): Any? { - return values - } - override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - realmData?.let { + this.viewModel.realmData?.let { val selectedData = it[position] selectedData?.let { data -> - values[1] = data - this.delegate.onRowValueChanged(values, this.row) + this.viewModel.someValues[1] = data + this.viewModel.onRowValueChanged() +// this.delegate.onRowValueChanged(values, this.row) dismiss() } } } - /** - * Init data - */ - override fun initData() { - val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") - if (bottomSheetData.size != 2) { - throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") - } - if (bottomSheetData[1].data == null) { - throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") - } - this.limit = bottomSheetData[0].defaultValue as Int? - this.realmData = bottomSheetData[1].data - } - /** * Init UI */ override fun initUI() { LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_game_list, view?.bottomSheetContainer, true) - values.add(0, limit) - values.add(1, null) + val limit = this.viewModel.limit + + this.viewModel.someValues.add(0, limit) + this.viewModel.someValues.add(1, null) chipGroup.removeAllViews() Limit.values().forEach { @@ -81,7 +60,7 @@ class BottomSheetListGameFragment : BottomSheetListFragment() { } chipGroup.setOnCheckedChangeListener { _, i -> - values[0] = i + this.viewModel.someValues[0] = i } if (limit == null) { @@ -89,7 +68,8 @@ class BottomSheetListGameFragment : BottomSheetListFragment() { } val viewManager2 = LinearLayoutManager(requireContext()) - dataAdapter = RowRepresentableAdapter(this, this) + val dataAdapter = RowRepresentableAdapter(this, this) + this.viewModel.dataAdapter = dataAdapter recyclerView2.apply { setHasFixedSize(true) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt index 7bbe3c9e..74ee06eb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt @@ -2,9 +2,7 @@ package net.pokeranalytics.android.ui.fragment.components.bottomsheet import android.app.Activity import android.content.Intent -import io.realm.RealmList import io.realm.RealmModel -import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity @@ -16,8 +14,6 @@ import net.pokeranalytics.android.ui.view.RowViewType */ open class BottomSheetMultiSelectionFragment : BottomSheetListFragment() { - private val selectedRows: ArrayList = ArrayList() - override fun viewTypeForPosition(position: Int): Int { return RowViewType.TITLE_CHECK.ordinal } @@ -29,39 +25,19 @@ open class BottomSheetMultiSelectionFragment : BottomSheetListFragment() { val pokerAnalyticsActivity = activity as PokerAnalyticsActivity val liveDataType = LiveData.values()[dataType] val proxyItem: RealmModel? = liveDataType.getData(pokerAnalyticsActivity.getRealm(), primaryKey) - selectedRows.add(proxyItem as RowRepresentable) - dataAdapter.refreshRow(proxyItem as RowRepresentable) + this.viewModel.selectedRows.add(proxyItem as RowRepresentable) + this.viewModel.refreshRow(proxyItem as RowRepresentable) +// dataAdapter.refreshRow(proxyItem as RowRepresentable) } } - override fun getValue(): Any? { - return selectedRows - } - override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - if (selectedRows.contains(row)) { - selectedRows.remove(row) - } else { - selectedRows.add(row) - } - dataAdapter.refreshRow(row) + this.viewModel.onRowSelected(row) } override fun isSelected(row: RowRepresentable): Boolean { - return selectedRows.contains(row) + return this.viewModel.isSelected(row) +// return selectedRows.contains(row) } - override fun initData() { - super.initData() - val bottomSheetData = - getData() ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") - if (bottomSheetData.size != 1) { - throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") - } - bottomSheetData.first().defaultValue?.let { - (it as RealmList<*>).forEach { row -> - this.selectedRows.add(row as RowRepresentable) - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt index 610e701c..e61e1552 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt @@ -15,11 +15,8 @@ import java.text.NumberFormat class BottomSheetNumericTextFragment : BottomSheetFragment() { - private var value: Double? = null - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() initUI() } @@ -28,21 +25,11 @@ class BottomSheetNumericTextFragment : BottomSheetFragment() { editText.requestFocus() } - override fun getValue(): Any? { - return this.value - } - - /** - * Init data - */ - private fun initData() { - } - /** * Init UI */ private fun initUI() { - val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + val data = getDescriptors()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") if (data.size != 1) { throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } @@ -50,10 +37,11 @@ class BottomSheetNumericTextFragment : BottomSheetFragment() { LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_edit_text, view?.bottomSheetContainer, true) data[0].hint?.let { editText.hint = getString(it) } + editText.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES editText.addTextChangedListener { - this.value = try { + this.viewModel.doubleValue = try { editText.text.toString().toDouble() } catch (e: Exception) { null @@ -70,8 +58,8 @@ class BottomSheetNumericTextFragment : BottomSheetFragment() { it.toString() } - if (valueHasPlaceholder) { - this.value = it.toString().toDoubleOrNull() + if (this.viewModel.valueAsPlaceholder) { +// this.viewModel.doubleValue = it.toString().toDoubleOrNull() editText.hint = valueString } else { editText.setText(valueString) @@ -80,7 +68,8 @@ class BottomSheetNumericTextFragment : BottomSheetFragment() { editText.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { - delegate.onRowValueChanged(getValue(), row) + this.viewModel.onRowValueChanged() +// delegate.onRowValueChanged(getValue(), row) dismiss() true } else { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt index 7af3f1da..f85dc2c2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt @@ -7,7 +7,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.bottom_sheet_list.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -16,44 +15,32 @@ import net.pokeranalytics.android.ui.view.RowRepresentable class BottomSheetStaticListFragment : BottomSheetFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { - private var staticRows: List = emptyList() - private lateinit var dataAdapter: RowRepresentableAdapter +// private var staticRows: List = emptyList() +// private lateinit var dataAdapter: RowRepresentableAdapter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() initUI() } override fun onResume() { super.onResume() - dataAdapter.notifyDataSetChanged() + this.viewModel.notifyDataSetChanged() +// dataAdapter.notifyDataSetChanged() } override fun adapterRows(): List? { - return this.staticRows + return this.viewModel.staticRows } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - this.delegate.onRowValueChanged(row, this.row) + this.viewModel.selectedRows.add(row) + this.viewModel.onRowValueChanged() +// this.delegate.onRowValueChanged(row, this.row) dismiss() super.onRowSelected(position, row, fromAction) } - /** - * Init data - */ - private fun initData() { - val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") - if (bottomSheetData.size != 1) { - throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") - } - if (bottomSheetData.first().staticData == null) { - throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") - } - this.staticRows = bottomSheetData.first().staticData as List - } - /** * Init UI */ @@ -61,7 +48,8 @@ class BottomSheetStaticListFragment : BottomSheetFragment(), StaticRowRepresenta LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_list, view?.bottomSheetContainer, true) val viewManager = LinearLayoutManager(requireContext()) - dataAdapter = RowRepresentableAdapter(this, this) + val dataAdapter = RowRepresentableAdapter(this, this) + this.viewModel.dataAdapter = dataAdapter reyclerView.apply { setHasFixedSize(true) 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 8f96c818..66d2423e 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 @@ -17,12 +17,8 @@ import java.text.NumberFormat class BottomSheetSumFragment : BottomSheetFragment() { - private var value = 0.0 - private var currentDefaultValue = 0.0 - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() initUI() } @@ -31,25 +27,12 @@ class BottomSheetSumFragment : BottomSheetFragment() { editText.requestFocus() } - override fun getValue(): Any? { - val editText2Value = editText2.text ?: "" - if (editText2Value.isEmpty()) { - return currentDefaultValue - } - return value - } - - /** - * Init data - */ - private fun initData() { - } /** * Init UI */ private fun initUI() { - val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + val data = getDescriptors()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") if (data.size != 5) { throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } @@ -58,16 +41,16 @@ class BottomSheetSumFragment : BottomSheetFragment() { if (data.size == 5) { // Default value for the sum - currentDefaultValue = try { - data[2].defaultValue as Double - } catch (e: Exception) { - 0.0 - } +// this.viewModel.currentDefaultValue = try { +// data[2].defaultValue as Double +// } catch (e: Exception) { +// 0.0 +// } val formatter = NumberFormat.getNumberInstance() formatter.maximumFractionDigits = 6 formatter.isGroupingUsed = false - currentValue.text = formatter.format(currentDefaultValue) + currentValue.text = formatter.format(this.viewModel.currentDefaultValue) // First value val defaultValue1 = try { @@ -76,10 +59,14 @@ class BottomSheetSumFragment : BottomSheetFragment() { 0.0 } - button1.text = "+ ${defaultValue1.toCurrency(currentCurrency)}" + val formattedValue1 = "+ ${defaultValue1.toCurrency(this.viewModel.currentCurrency)}" + button1.text = formattedValue1 button1.visibility = if (defaultValue1 > 0) View.VISIBLE else View.GONE button1.setOnClickListener { - this.delegate.onRowValueChanged(currentDefaultValue + defaultValue1, row) +// val newValue = this.viewModel.currentDefaultValue + defaultValue1 + this.viewModel.doubleValue = this.viewModel.currentDefaultValue + defaultValue1 + this.viewModel.onRowValueChanged() +// this.delegate.onRowValueChanged(currentDefaultValue + defaultValue1, row) dismiss() } @@ -90,10 +77,13 @@ class BottomSheetSumFragment : BottomSheetFragment() { 0.0 } - button2.text = "+ ${defaultValue2.toCurrency(currentCurrency)}" + val formattedValue2 = "+ ${defaultValue2.toCurrency(this.viewModel.currentCurrency)}" + button2.text = formattedValue2 button2.visibility = if (defaultValue2 > 0) View.VISIBLE else View.GONE button2.setOnClickListener { - this.delegate.onRowValueChanged(currentDefaultValue + defaultValue2, row) + this.viewModel.doubleValue = this.viewModel.currentDefaultValue + defaultValue2 + this.viewModel.onRowValueChanged() +// this.delegate.onRowValueChanged(currentDefaultValue + defaultValue2, row) dismiss() } @@ -106,7 +96,7 @@ class BottomSheetSumFragment : BottomSheetFragment() { } catch (e: Exception) { 0.0 } - editText2.setText((currentDefaultValue + valueToAdd).round()) + editText2.setText((this.viewModel.currentDefaultValue + valueToAdd).round()) } @@ -114,7 +104,7 @@ class BottomSheetSumFragment : BottomSheetFragment() { data[4].hint?.let { editText2.hint = getString(it) } editText2.inputType = data[4].inputType ?: InputType.TYPE_CLASS_TEXT editText2.addTextChangedListener { - value = try { + this.viewModel.doubleValue = try { it.toString().toDouble() } catch (e: Exception) { 0.0 @@ -123,7 +113,8 @@ class BottomSheetSumFragment : BottomSheetFragment() { editText2.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { - this.delegate.onRowValueChanged(value, row) + this.viewModel.onRowValueChanged() +// this.delegate.onRowValueChanged(value, 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 c9f3bbba..d58f839d 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 @@ -6,7 +6,6 @@ import android.view.View import androidx.recyclerview.widget.GridLayoutManager import kotlinx.android.synthetic.main.bottom_sheet_grid.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* -import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -17,33 +16,17 @@ import net.pokeranalytics.android.ui.view.RowRepresentable class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { - private lateinit var dataAdapter: RowRepresentableAdapter - private var defaultSize: Int? = null +// private lateinit var dataAdapter: RowRepresentableAdapter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() initUI() } override fun onResume() { super.onResume() - dataAdapter.notifyDataSetChanged() - } - - override fun getValue(): Any? { - return defaultSize - } - - /** - * Init data - */ - private fun initData() { - val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") - if (bottomSheetData.size != 1) { - throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") - } - defaultSize = bottomSheetData.first().defaultValue as Int? + this.viewModel.notifyDataSetChanged() +// dataAdapter.notifyDataSetChanged() } /** @@ -54,7 +37,8 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowReprese .inflate(net.pokeranalytics.android.R.layout.bottom_sheet_grid, view?.bottomSheetContainer, true) val viewManager = GridLayoutManager(requireContext(), 3) - dataAdapter = RowRepresentableAdapter(this, this) + val dataAdapter = RowRepresentableAdapter(this, this) + this.viewModel.dataAdapter = dataAdapter val spanCount = 3 val spacing = 2.px @@ -73,7 +57,9 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowReprese } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - this.delegate.onRowValueChanged((row as TableSize).numberOfPlayer, this.row) + this.viewModel.defaultSize = (row as TableSize).numberOfPlayer + this.viewModel.onRowValueChanged() +// this.delegate.onRowValueChanged((row as TableSize).numberOfPlayer, this.row) dismiss() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/BottomSheetViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/BottomSheetViewModel.kt new file mode 100644 index 00000000..a696318e --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/BottomSheetViewModel.kt @@ -0,0 +1,251 @@ +package net.pokeranalytics.android.ui.viewmodel + +import androidx.lifecycle.ViewModel +import io.realm.RealmList +import io.realm.RealmResults +import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException +import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate +import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor +import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow +import java.util.* + +class BottomSheetViewModel : ViewModel() { + + lateinit var row: RowRepresentable + lateinit var delegate: RowRepresentableDelegate + + var currentCurrency: Currency? = null + var valueAsPlaceholder: Boolean = false + var isClearable: Boolean = true + var isDeletable: Boolean = false + var rowRepresentableEditDescriptors: ArrayList? = null + + /** + * Storage for a data that has been newly created + */ + var addedData: Any? = null + + /** + * String storage + */ + var stringValue: String? = null + var secondStringValue: String? = null + + /** + Double Edit Text + */ + val values = ArrayList() + var isEditingBlinds: Boolean = false + + /** + * Lists, dynamic or static + */ + lateinit var dataAdapter: RowRepresentableAdapter + var realmData: RealmResults? = null + var staticRows: List = emptyList() + + /** + * Sum + */ + var doubleValue: Double? = 0.0 + var currentDefaultValue = 0.0 + + /** + * Table Size + */ + var defaultSize: Int? = null + + /** + * Multiselection + */ + val selectedRows: ArrayList = ArrayList() + + /** + * Limit and Game + */ + var limit: Int? = 0 + val someValues = ArrayList() + + fun load() { + + when(this.row.bottomSheetType) { + BottomSheetType.DOUBLE_EDIT_TEXT -> { + val descriptors = this.rowRepresentableEditDescriptors ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (descriptors.size != 2) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + + this.isEditingBlinds = this.row == SessionRow.BLINDS + + this.stringValue = descriptors[0].defaultValue as? String + this.secondStringValue = descriptors[1].defaultValue as? String + } + BottomSheetType.SUM -> { + val descriptors = this.rowRepresentableEditDescriptors ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (descriptors.size != 5) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + + this.currentDefaultValue = try { + descriptors[2].defaultValue as Double + } catch (e: Exception) { + 0.0 + } + } + BottomSheetType.LIST -> { + + val bottomSheetData = this.rowRepresentableEditDescriptors ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + if (bottomSheetData.first().data == null) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + this.realmData = bottomSheetData.first().data as RealmResults + + } + BottomSheetType.DOUBLE_LIST, BottomSheetType.LIST_GAME -> { + val bottomSheetData = this.rowRepresentableEditDescriptors ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 2) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + if (bottomSheetData[1].data == null) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + this.limit = bottomSheetData[0].defaultValue as Int? + this.realmData = bottomSheetData[1].data + } + BottomSheetType.MULTI_SELECTION -> { + + val bottomSheetData = + this.rowRepresentableEditDescriptors ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + + this.realmData = bottomSheetData.first().data as RealmResults + bottomSheetData.first().defaultValue?.let { + (it as RealmList<*>).forEach { row -> + this.selectedRows.add(row as RowRepresentable) + } + } + + } + BottomSheetType.NUMERIC_TEXT -> { + val bottomSheetData = + this.rowRepresentableEditDescriptors + ?: throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + bottomSheetData[0].defaultValue?.let { + this.doubleValue = it.toString().toDoubleOrNull() + } + } + BottomSheetType.LIST_STATIC -> { + val bottomSheetData = this.rowRepresentableEditDescriptors ?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + if (bottomSheetData.first().staticData == null) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + this.staticRows = bottomSheetData.first().staticData as List + + } + BottomSheetType.GRID -> { + val bottomSheetData = this.rowRepresentableEditDescriptors ?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + this.defaultSize = bottomSheetData.first().defaultValue as Int? + + } + else -> {} + } + + } + + fun getValue() : Any? { + return when(this.row.bottomSheetType) { + BottomSheetType.DOUBLE_EDIT_TEXT -> { + if (this.values.isEmpty()) { return null } + if (this.values.all { it.isEmpty() }) { return null } + return this.values + } + BottomSheetType.EDIT_TEXT, BottomSheetType.EDIT_TEXT_MULTI_LINES -> { + this.stringValue?.trim()?.let { + if (it.isNotEmpty()) { + return it + } + } + return null + } + BottomSheetType.MULTI_SELECTION -> this.selectedRows + BottomSheetType.NUMERIC_TEXT -> this.doubleValue + BottomSheetType.GRID -> this.defaultSize + BottomSheetType.DOUBLE_LIST, BottomSheetType.LIST_GAME -> this.someValues + BottomSheetType.LIST_STATIC -> this.selectedRows.firstOrNull() + BottomSheetType.SUM -> this.doubleValue + else -> null + } + } + + fun onClear() { + this.delegate.onRowValueChanged(null, this.row) + } + + fun onRowValueChanged() { + + // if some data has been added + this.addedData?.let { + this.delegate.onRowValueChanged(it, this.row) + return + } + + // otherwise, default behavior + val value = when(this.row.bottomSheetType) { + BottomSheetType.DOUBLE_EDIT_TEXT -> arrayListOf(this.stringValue, this.secondStringValue) + BottomSheetType.DOUBLE_LIST, BottomSheetType.LIST_GAME -> arrayListOf(this.someValues[0], this.someValues[1]) + else -> getValue() + } + + this.delegate.onRowValueChanged(value, this.row) + } + + fun onRowDeleted() { + this.delegate.onRowDeleted(this.row) + } + + fun onRowSelected(row: RowRepresentable) { + if (this.selectedRows.contains(row)) { + this.selectedRows.remove(row) + } else { + this.selectedRows.add(row) + } + this.refreshRow(row) + } + + fun onRowSelected(position: Int) { + val value = when(this.row.bottomSheetType) { + BottomSheetType.LIST -> this.realmData?.get(position) + BottomSheetType.LIST_STATIC -> this.staticRows[position] + else -> throw PAIllegalStateException("row selected for unmanaged bottom sheet type") + } + this.delegate.onRowValueChanged(value, this.row) + } + + fun isSelected(row: RowRepresentable): Boolean { + return this.selectedRows.contains(row) + } + + fun notifyDataSetChanged() { + this.dataAdapter.notifyDataSetChanged() + } + + fun refreshRow(row: RowRepresentable) { + this.dataAdapter.refreshRow(row) + } + +}