From 0aac37b2889e61eb3697a567b605ed2d7b415c71 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 25 Nov 2022 11:29:07 +0100 Subject: [PATCH] Fixes issue when creating subdata --- .../pokeranalytics/android/model/LiveData.kt | 19 ++++++- .../ui/activity/components/BaseActivity.kt | 7 +++ .../ui/fragment/components/BaseFragment.kt | 5 ++ .../bottomsheet/BottomSheetFragment.kt | 27 ++++++++-- .../BottomSheetListGameFragment.kt | 7 +-- .../ui/modules/data/DataManagerFragment.kt | 51 +++++++++++++------ .../ui/modules/data/EditableDataFragment.kt | 1 - .../modules/data/TransactionDataFragment.kt | 21 +++++++- .../ui/modules/session/SessionFragment.kt | 15 ++++++ .../ui/viewmodel/DataManagerViewModel.kt | 12 +++++ app/src/main/res/layout/activity_home.xml | 3 +- .../res/layout/fragment_editable_data.xml | 4 +- 12 files changed, 142 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt index 42c9d49f..e188a238 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -8,7 +8,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.model.realm.handhistory.HandHistory -import net.pokeranalytics.android.ui.modules.data.EditableDataActivity +import net.pokeranalytics.android.ui.modules.data.* import net.pokeranalytics.android.ui.modules.handhistory.HandHistoryActivity import net.pokeranalytics.android.ui.view.Localizable import net.pokeranalytics.android.util.extensions.findById @@ -32,6 +32,10 @@ enum class LiveData : Localizable { var subType: Int? = null + fun instanceFromOrdinal(ordinal: Int): LiveData { + return values()[ordinal] + } + val relatedEntity: Class get() { return when (this) { @@ -186,4 +190,17 @@ enum class LiveData : Localizable { } } + val dataFragment: EditableDataFragment + get() { + return when (this) { + BANKROLL -> BankrollDataFragment() + LOCATION -> LocationDataFragment() + TRANSACTION -> TransactionDataFragment() + CUSTOM_FIELD -> CustomFieldDataFragment() + TRANSACTION_TYPE -> TransactionTypeDataFragment() + PLAYER -> PlayerDataFragment() + else -> EditableDataFragment() + } + } + } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt index 85e38f56..d23270f0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt @@ -129,6 +129,13 @@ abstract class BaseActivity : AppCompatActivity() { fragmentTransaction.commit() } + fun addFragmentWithBackStack(fragment: Fragment, containerId: Int) { + val fragmentTransaction = supportFragmentManager.beginTransaction() + fragmentTransaction.add(containerId, fragment) + fragmentTransaction.addToBackStack(fragment.javaClass.toString()) + fragmentTransaction.commit() + } + /** * Return the realm instance */ 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 1608817f..f10208df 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 @@ -109,6 +109,11 @@ abstract class BaseFragment : Fragment() { view?.findViewById(R.id.toolbar)?.let { toolbar -> parentActivity?.setSupportActionBar(toolbar) } + + context?.getColor(R.color.kaki_darkest)?.let { color -> + view?.setBackgroundColor(color) + } + } /** 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 8990d8c8..fd0a4d33 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 @@ -18,11 +18,13 @@ import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.activity.components.BaseActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate +import net.pokeranalytics.android.ui.fragment.components.BaseFragment import net.pokeranalytics.android.ui.modules.data.EditableDataActivity import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rows.SessionPropertiesRow import net.pokeranalytics.android.ui.view.rows.TransactionPropertiesRow +import net.pokeranalytics.android.ui.viewmodel.AddedDataViewModel import net.pokeranalytics.android.ui.viewmodel.BottomSheetViewModel import net.pokeranalytics.android.ui.viewmodel.BottomSheetViewModelFactory import timber.log.Timber @@ -49,6 +51,10 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { private var _binding: FragmentBottomSheetBinding? = null private val binding get() = _binding!! + protected open val addedDataViewModel: AddedDataViewModel by lazy { + ViewModelProvider(requireActivity()).get(AddedDataViewModel::class.java) + } + companion object { private var config: BottomSheetConfig? = null @@ -233,11 +239,22 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { else -> throw PAIllegalStateException("row $it does not have an associated LiveData value") } - EditableDataActivity.newInstanceForResult( - this, - liveData, - requestCode = REQUEST_CODE_ADD_NEW_OBJECT - ) + val fragment = liveData.dataFragment +// + this.addedDataViewModel.dataForAdd = true + + val bundle = Bundle() + bundle.putInt(BaseFragment.BundleKey.DATA_TYPE.value, liveData.ordinal) + fragment.arguments = bundle + (this.activity as BaseActivity).addFragmentWithBackStack(fragment, R.id.container) + + dismiss() + +// EditableDataActivity.newInstanceForResult( +// this, +// liveData, +// requestCode = REQUEST_CODE_ADD_NEW_OBJECT +// ) 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 edf77cd6..bdaf01f6 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 @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.core.view.get import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.chip.Chip +import io.realm.RealmModel import net.pokeranalytics.android.databinding.BottomSheetGameListBinding import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -38,10 +39,10 @@ class BottomSheetListGameFragment : BottomSheetListFragment() { } override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { - this.model.realmData?.let { - val selectedData = it[position] + this.model.realmData?.let { realmResults -> + val selectedData = realmResults[position] selectedData?.let { data -> - this.model.someValues[1] = data + this.model.someValues[1] = realmResults.realm.copyFromRealm(data as RealmModel) this.onRowValueChanged() // this.delegate.onRowValueChanged(values, this.row) dismiss() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/DataManagerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/DataManagerFragment.kt index ad620232..f8e17247 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/DataManagerFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/DataManagerFragment.kt @@ -5,19 +5,17 @@ import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuInflater -import android.view.MenuItem import android.view.View import androidx.appcompat.app.AlertDialog import androidx.lifecycle.ViewModelProvider -import io.realm.kotlin.isManaged import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.ConfigurationException import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.modules.datalist.DataListActivity +import net.pokeranalytics.android.ui.viewmodel.AddedDataViewModel import net.pokeranalytics.android.ui.viewmodel.DataManagerViewModel -import timber.log.Timber open class DataManagerFragment : RealmFragment() { @@ -25,6 +23,10 @@ open class DataManagerFragment : RealmFragment() { ViewModelProvider(this).get(modelClass) } + protected open val addedDataViewModel: AddedDataViewModel by lazy { + ViewModelProvider(requireActivity()).get(AddedDataViewModel::class.java) + } + open val modelClass: Class = DataManagerViewModel::class.java var deleteButtonShouldAppear = false @@ -50,10 +52,22 @@ open class DataManagerFragment : RealmFragment() { menu.clear() inflater.inflate(R.menu.toolbar_editable_data, menu) this.editableMenu = menu + setMenuListeners() updateMenuUI() super.onCreateOptionsMenu(menu, inflater) } + private fun setMenuListeners() { + editableMenu?.findItem(R.id.delete)?.setOnMenuItemClickListener { + deleteData() + return@setOnMenuItemClickListener true + } + editableMenu?.findItem(R.id.save)?.setOnMenuItemClickListener { + saveData() + return@setOnMenuItemClickListener true + } + } + /** * Update menu UI */ @@ -62,13 +76,13 @@ open class DataManagerFragment : RealmFragment() { editableMenu?.findItem(R.id.save)?.isVisible = this.saveButtonShouldAppear } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.save -> saveData() - R.id.delete -> deleteData() - } - return true - } +// override fun onOptionsItemSelected(item: MenuItem): Boolean { +// when (item.itemId) { +// R.id.save -> saveData() +// R.id.delete -> deleteData() +// } +// return true +// } /** * Init data @@ -93,15 +107,20 @@ open class DataManagerFragment : RealmFragment() { val status = savable.getSaveValidityStatus(realm = this.getRealm()) when (status) { SaveValidityStatus.VALID -> { - Timber.d("ismanaged = ${this.model.item.isManaged()}") + this.getRealm().executeTransactionAsync { asyncRealm -> - val managedItem = asyncRealm.copyToRealmOrUpdate(this.model.item) - if (managedItem is Savable) { - val uniqueIdentifier = managedItem.id - finishActivityWithResult(uniqueIdentifier) - } + asyncRealm.copyToRealmOrUpdate(savable) } + onDataSaved() + + if (this.addedDataViewModel.dataForAdd) { + this.addedDataViewModel.data.value = savable + this.parentActivity?.supportFragmentManager?.popBackStack() + } else { + val uniqueIdentifier = savable.id + finishActivityWithResult(uniqueIdentifier) + } } else -> { val message = savable.getFailedSaveMessage(status) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt index f2765415..4cce6e5b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt @@ -42,7 +42,6 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat this.model.primaryKey = this.arguments?.getString(BundleKey.PRIMARY_KEY.value) this.model.loadItemWithRealm(getRealm()) - } open fun indexOfFirstRowToSelect(): Int { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/TransactionDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/TransactionDataFragment.kt index a8d9929b..97fd01c2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/TransactionDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/TransactionDataFragment.kt @@ -2,7 +2,10 @@ package net.pokeranalytics.android.ui.modules.data import android.content.Context import io.realm.kotlin.where -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import net.pokeranalytics.android.calculus.bankroll.BankrollReportManager import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Transaction @@ -30,6 +33,11 @@ class TransactionDataFragment : EditableDataFragment(), StaticRowRepresentableDa return this.model.item as Transaction } + override fun onDestroyView() { + super.onDestroyView() + this.addedDataViewModel.data.removeObservers(this) + } + override fun initData() { super.initData() @@ -42,6 +50,14 @@ class TransactionDataFragment : EditableDataFragment(), StaticRowRepresentableDa } } } + + this.addedDataViewModel.data.observeForever { + if (this.addedDataViewModel.dataForAdd) { + this.addedDataViewModel.dataForAdd = false + this.onRowValueChanged(it, this.addedDataViewModel.dataIdentifier) + } + } + } override fun indexOfFirstRowToSelect(): Int { @@ -101,6 +117,9 @@ class TransactionDataFragment : EditableDataFragment(), StaticRowRepresentableDa } override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { + + this.addedDataViewModel.dataIdentifier = row + when (row) { TransactionPropertiesRow.DATE -> DateTimePickerManager.create( requireContext(), diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt index 8c062595..c5d9b3d8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt @@ -35,6 +35,7 @@ import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.modules.handhistory.HandHistoryActivity import net.pokeranalytics.android.ui.view.* import net.pokeranalytics.android.ui.view.rows.SessionPropertiesRow +import net.pokeranalytics.android.ui.viewmodel.AddedDataViewModel import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.extensions.* @@ -46,6 +47,10 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr private lateinit var model: SessionViewModel + private val addedDataViewModel: AddedDataViewModel by lazy { + ViewModelProvider(requireActivity()).get(AddedDataViewModel::class.java) + } + companion object { const val TIMER_DELAY = 5000L const val REQUEST_CODE_NEW_CUSTOM_FIELD = 1000 @@ -102,13 +107,21 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr super.onViewCreated(view, savedInstanceState) loadOrCreateSession() initUI() + initData() } override fun onDestroyView() { super.onDestroyView() + this.addedDataViewModel.data.removeObservers(this) _binding = null } + private fun initData() { + this.addedDataViewModel.data.observeForever { + this.onRowValueChanged(it, this.addedDataViewModel.dataIdentifier) + } + } + /** * Init UI */ @@ -223,6 +236,8 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr return } + this.addedDataViewModel.dataIdentifier = row + val session = this.currentSession val data = this.editDescriptors(row) 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 index e5787a94..a0048f37 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/DataManagerViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/viewmodel/DataManagerViewModel.kt @@ -1,9 +1,21 @@ package net.pokeranalytics.android.ui.viewmodel +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import io.realm.Realm import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Deletable +import net.pokeranalytics.android.model.interfaces.Identifiable +import net.pokeranalytics.android.ui.view.RowRepresentable + +open class AddedDataViewModel : ViewModel() { + + var dataForAdd = true + + lateinit var dataIdentifier: RowRepresentable + var data: MutableLiveData = MutableLiveData() + +} open class DataManagerViewModel : ViewModel() { diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index dd080ad1..cf7ba636 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -1,5 +1,6 @@ - -