diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt index e8b97630..238ec2ab 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt @@ -15,7 +15,9 @@ abstract class BaseFragment : Fragment() { var parentActivity: BaseActivity? = null enum class BundleKey(val value: String) { - STYLE("style") + STYLE("style"), + PRIMARY_KEY("primary_key"), + DATA_TYPE("data_type") } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt index c12601c6..6ebb912c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt @@ -37,7 +37,7 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS // Return the item as a Bankroll object private val bankroll: Bankroll get() { - return this.item as Bankroll + return this.viewModel.item as Bankroll } private lateinit var defaultCurrency: Currency diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt index 53fae129..2a46cb58 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt @@ -33,7 +33,7 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa // Return the item as a Custom TypedCSVField object private val customField: CustomField get() { - return this.item as CustomField + return this.viewModel.item as CustomField } private val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt index 9a1b8b63..ea95564e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt @@ -8,22 +8,26 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import androidx.appcompat.app.AlertDialog +import androidx.lifecycle.ViewModelProviders import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.ConfigurationException -import net.pokeranalytics.android.model.LiveData -import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.fragment.components.RealmFragment +import net.pokeranalytics.android.ui.viewmodel.DataManagerViewModel open class DataManagerFragment : RealmFragment() { - lateinit var item: Deletable + protected val viewModel: DataManagerViewModel by lazy { + ViewModelProviders.of(this).get(DataManagerViewModel::class.java) + } - protected lateinit var liveDataType: LiveData - protected var primaryKey: String? = null +// lateinit var item: Deletable +// protected lateinit var liveDataType: LiveData +// protected var primaryKey: String? = null +// protected var dataType: Int? = null var deleteButtonShouldAppear = false set(value) { @@ -37,7 +41,6 @@ open class DataManagerFragment : RealmFragment() { this.updateMenuUI() } - protected var dataType: Int? = null private var editableMenu: Menu? = null @@ -75,8 +78,8 @@ open class DataManagerFragment : RealmFragment() { */ private fun loadItem() { - this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) - this.deleteButtonShouldAppear = this.primaryKey != null +// this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) + this.deleteButtonShouldAppear = this.viewModel.primaryKey != null } @@ -85,7 +88,7 @@ open class DataManagerFragment : RealmFragment() { */ protected open fun saveData() { - val savable = this.item + val savable = this.viewModel.item this.willSaveData() when (savable) { @@ -94,7 +97,7 @@ open class DataManagerFragment : RealmFragment() { when (status) { SaveValidityStatus.VALID -> { this.getRealm().executeTransaction { - val managedItem = it.copyToRealmOrUpdate(this.item) + val managedItem = it.copyToRealmOrUpdate(this.viewModel.item) if (managedItem is Savable) { val uniqueIdentifier = managedItem.id finishActivityWithResult(uniqueIdentifier) @@ -132,14 +135,14 @@ open class DataManagerFragment : RealmFragment() { val realm = this.getRealm() - if (this.item.isValidForDelete(realm)) { + if (this.viewModel.item.isValidForDelete(realm)) { val intent = Intent() - intent.putExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, this.item.id) + intent.putExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, this.viewModel.item.id) activity?.setResult(Activity.RESULT_OK, intent) activity?.finish() } else { - val status = this.item.getDeleteStatus(requireContext(), realm) - val message = this.item.getFailedDeleteMessage(status) + val status = this.viewModel.item.getDeleteStatus(requireContext(), realm) + val message = this.viewModel.item.getFailedDeleteMessage(status) val builder = AlertDialog.Builder(requireContext()) .setMessage(message) .setNegativeButton(R.string.ok, null) @@ -154,7 +157,7 @@ open class DataManagerFragment : RealmFragment() { */ private fun finishActivityWithResult(uniqueIdentifier: String) { val intent = Intent() - intent.putExtra(EditableDataActivity.IntentKey.DATA_TYPE.keyName, dataType) + intent.putExtra(EditableDataActivity.IntentKey.DATA_TYPE.keyName, viewModel.dataType) intent.putExtra(EditableDataActivity.IntentKey.PRIMARY_KEY.keyName, uniqueIdentifier) activity?.setResult(Activity.RESULT_OK, intent) activity?.finish() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index abd63c7e..2a4bd647 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -10,7 +10,6 @@ import io.realm.RealmModel import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_editable_data.view.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Editable import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource @@ -39,6 +38,10 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat open fun initData() { + this.viewModel.dataType = this.arguments?.getInt(BundleKey.DATA_TYPE.value) + this.viewModel.primaryKey = this.arguments?.getString(BundleKey.PRIMARY_KEY.value) + viewModel.loadItemWithRealm(getRealm()) + val dataSource = getDataSource() this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) //this.rowRepresentableAdapter.setHasStableIds(true) @@ -57,9 +60,12 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat * Set fragment data */ fun setData(dataType: Int, primaryKey: String?) { - this.dataType = dataType - this.liveDataType = LiveData.values()[dataType] - this.primaryKey = primaryKey + + val bundle = Bundle() + bundle.putString(BundleKey.PRIMARY_KEY.value, primaryKey) + bundle.putInt(BundleKey.DATA_TYPE.value, dataType) + this.arguments = bundle + } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { @@ -69,7 +75,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat override fun onRowValueChanged(value: Any?, row: RowRepresentable) { this.getRealm().executeTransaction { try { - (this.item as Editable).updateValue(value, row) + (this.viewModel.item as Editable).updateValue(value, row) } catch (e: Exception) { Crashlytics.log("Exception caught: row = $row, value=$value, class=${this.javaClass}") throw e @@ -86,13 +92,16 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat setDisplayHomeAsUpEnabled(true) - val proxyItem: RealmModel? = this.liveDataType.getData(this.getRealm(), primaryKey) + val liveDataType = this.viewModel.liveDataType + + val proxyItem: RealmModel? = + liveDataType.getData(this.getRealm(), this.viewModel.primaryKey) proxyItem?.let { - this.appBar.toolbar.title = this.liveDataType.updateEntityLocalizedTitle(requireContext()) + this.appBar.toolbar.title = liveDataType.updateEntityLocalizedTitle(requireContext()) deleteButtonShouldAppear = true isUpdating = true } ?: run { - this.appBar.toolbar.title = this.liveDataType.newEntityLocalizedTitle(requireContext()) + this.appBar.toolbar.title = liveDataType.newEntityLocalizedTitle(requireContext()) } val viewManager = LinearLayoutManager(requireContext()) @@ -106,7 +115,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat * Return the data source */ open fun getDataSource(): RowRepresentableDataSource { - return this.item as RowRepresentableDataSource + return this.viewModel.item as RowRepresentableDataSource } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt index 34853369..0bcb762a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt @@ -23,7 +23,7 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS // Return the item as a Location object private val location: Location get() { - return this.item as Location + return this.viewModel.item as Location } // Loader boolean diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/PlayerDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/PlayerDataFragment.kt index fece704e..268804a2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/PlayerDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/PlayerDataFragment.kt @@ -40,7 +40,7 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou private val player: Player get() { - return this.item as Player + return this.viewModel.item as Player } private var mediaActivity: MediaActivity? = null diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt index 34b20d34..78518743 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt @@ -30,7 +30,7 @@ class TransactionDataFragment : EditableDataFragment(), StaticRowRepresentableDa // Return the item as a Transaction object private val transaction: Transaction get() { - return this.item as Transaction + return this.viewModel.item as Transaction } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -95,7 +95,7 @@ class TransactionDataFragment : EditableDataFragment(), StaticRowRepresentableDa super.onRowValueChanged(value, row) rowRepresentableAdapter.refreshRow(row) - if (primaryKey == null) { // automatically change the row for new data + if (viewModel.primaryKey == null) { // automatically change the row for new data GlobalScope.launch(Dispatchers.Main) { delay(200) when (row) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt index 0340bdc3..0e010122 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionTypeDataFragment.kt @@ -12,7 +12,7 @@ class TransactionTypeDataFragment : EditableDataFragment(), RowRepresentableData val transactionType: TransactionType get() { - return this.item as TransactionType + return this.viewModel.item as TransactionType } // RowRepresentableDataSource diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt index 415943f8..fb87d866 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt @@ -21,36 +21,41 @@ import net.pokeranalytics.android.util.extensions.findById abstract class AbstractReportFragment : DataManagerFragment() { - protected val viewModel: ReportViewModel by lazy { + protected val reportViewModel: ReportViewModel by lazy { (requireActivity() as ViewModelHolder).viewModel as ReportViewModel } val selectedReport: Report get() { - return this.viewModel.report + return this.reportViewModel.report } val stat: Stat get() { - return this.viewModel.stat + return this.reportViewModel.stat } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) + private fun initData() { - this.primaryKey = this.selectedReport.options.reportSetupId - this.liveDataType = LiveData.REPORT_SETUP - this.deleteButtonShouldAppear = (this.primaryKey != null) - this.saveButtonShouldAppear = this.selectedReport.options.userGenerated + this.viewModel.dataType = LiveData.REPORT_SETUP.ordinal + this.viewModel.primaryKey = this.selectedReport.options.reportSetupId + + this.viewModel.loadItemWithRealm(getRealm()) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + initData() + + this.deleteButtonShouldAppear = (this.viewModel.primaryKey != null) + this.saveButtonShouldAppear = this.selectedReport.options.userGenerated + setDisplayHomeAsUpEnabled(true) - setToolbarTitle(this.viewModel.title) + setToolbarTitle(this.reportViewModel.title) } + override fun saveData() { activity?.let { @@ -66,7 +71,7 @@ abstract class AbstractReportFragment : DataManagerFragment() { view.findViewById(net.pokeranalytics.android.R.id.reportName) nameEditText.inputType = InputType.TYPE_TEXT_FLAG_CAP_SENTENCES - this.primaryKey?.let { id -> + this.viewModel.primaryKey?.let { id -> getRealm().findById(id)?.let { reportSetup -> nameEditText.hint = reportSetup.name } @@ -104,11 +109,11 @@ abstract class AbstractReportFragment : DataManagerFragment() { private fun saveReport(name: String) { - this.viewModel.title = name - val rs = this.item as ReportSetup + this.reportViewModel.title = name + val rs = this.viewModel.item as ReportSetup getRealm().executeTransaction { realm -> - val firstSave = (this.primaryKey == null) + val firstSave = (this.viewModel.primaryKey == null) if (firstSave) { val options = this.selectedReport.options rs.name = name @@ -134,9 +139,9 @@ abstract class AbstractReportFragment : DataManagerFragment() { } - this.primaryKey = rs.id + this.viewModel.primaryKey = rs.id this.deleteButtonShouldAppear = true - setToolbarTitle(this.viewModel.title) + setToolbarTitle(this.reportViewModel.title) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt index 89d88cec..517605a0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt @@ -36,7 +36,7 @@ class ComparisonReportFragment : AbstractReportFragment() { */ private fun initUI() { - viewPager.adapter = ReportPagerAdapter(requireContext(), requireActivity().supportFragmentManager, this.viewModel) + viewPager.adapter = ReportPagerAdapter(requireContext(), requireActivity().supportFragmentManager, this.reportViewModel) // setDisplayHomeAsUpEnabled(true) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt index d57407be..90004c77 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt @@ -95,7 +95,7 @@ class ProgressReportFragment : AbstractReportFragment() { this.chipGroup.addView(chip) } - this.chipGroup.isVisible = this.viewModel.showAggregationChoices + this.chipGroup.isVisible = this.reportViewModel.showAggregationChoices this.chipGroup.isSingleSelection = true this.chipGroup.check(0) @@ -184,14 +184,14 @@ class ProgressReportFragment : AbstractReportFragment() { } dataSet?.let { ds -> - this.viewModel.defineParameters(stat, aggregationType.axisFormatting) + this.reportViewModel.defineParameters(stat, aggregationType.axisFormatting) when (ds) { is LineDataSet -> { - this.viewModel.setLineDataSet(ds) + this.reportViewModel.setLineDataSet(ds) graphFragment.reload(GraphFragment.Style.LINE) } is BarDataSet -> { - this.viewModel.setBarDataSet(ds) + this.reportViewModel.setBarDataSet(ds) graphFragment.reload(GraphFragment.Style.BAR) } else -> throw PAIllegalStateException("unmanaged data set") diff --git a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/DataManagerViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/DataManagerViewModel.kt new file mode 100644 index 00000000..6dff061c --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/DataManagerViewModel.kt @@ -0,0 +1,40 @@ +package net.pokeranalytics.android.ui.viewmodel + +import androidx.lifecycle.ViewModel +import io.realm.Realm +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.interfaces.Deletable + +class DataManagerViewModel : ViewModel() { + + /*** + * A deletable object + */ + lateinit var item: Deletable + + /*** + * An optional primary key + */ + var primaryKey: String? = null + + /*** + * The data type of the managed object + */ + var dataType: Int? = null + set(value) { + field = value + if (value != null) { + this.liveDataType = LiveData.values()[value] + } + } + + /*** + * A Live Data value + */ + lateinit var liveDataType: LiveData + + fun loadItemWithRealm(realm: Realm) { + this.item = liveDataType.updateOrCreate(realm, primaryKey) + } + +} \ No newline at end of file