From bbc7d154cab1b860ed3cfcd94b433b03a4852d68 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 3 Mar 2020 16:33:38 +0100 Subject: [PATCH] View hands from Session --- app/src/main/AndroidManifest.xml | 2 +- .../pokeranalytics/android/model/LiveData.kt | 49 ++++++- .../android/model/realm/Session.kt | 3 +- .../model/realm/handhistory/HandHistory.kt | 25 +++- .../android/ui/activity/DataListActivity.kt | 78 ----------- .../ui/activity/FiltersListActivity.kt | 15 ++- .../ui/activity/components/BaseActivity.kt | 2 +- .../FeedHandHistoryRowRepresentableAdapter.kt | 40 +++--- .../ui/fragment/BankrollDetailsFragment.kt | 2 +- .../android/ui/fragment/BankrollFragment.kt | 2 +- .../fragment/DataSelectionDialogFragment.kt | 52 -------- .../android/ui/fragment/FeedFragment.kt | 1 + .../ui/fragment/FiltersListFragment.kt | 96 +++++++------- .../android/ui/fragment/ReportsFragment.kt | 2 +- .../android/ui/fragment/SessionFragment.kt | 5 + .../android/ui/fragment/SettingsFragment.kt | 1 + .../components/DeletableItemFragment.kt | 2 +- .../ui/fragment/data/DataManagerFragment.kt | 2 +- .../ui/modules/datalist/DataListActivity.kt | 113 ++++++++++++++++ .../datalist}/DataListFragment.kt | 124 +++++++----------- .../ui/modules/datalist/DataListViewModel.kt | 55 ++++++++ .../datalist/DataSelectionDialogFragment.kt | 59 +++++++++ .../handhistory/HandHistoryActivity.kt | 8 +- .../handhistory/HandHistoryFragment.kt | 4 +- .../views/RowHandHistoryViewHolder.kt | 26 +++- .../ui/view/rowrepresentable/SessionRow.kt | 30 +++-- .../main/res/layout/activity_data_list.xml | 2 +- .../layout/fragment_data_selection_dialog.xml | 10 +- app/src/main/res/layout/row_hand_history.xml | 8 +- .../main/res/layout/row_hand_history_view.xml | 4 +- 30 files changed, 505 insertions(+), 317 deletions(-) delete mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt delete mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/DataSelectionDialogFragment.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListActivity.kt rename app/src/main/java/net/pokeranalytics/android/ui/{fragment => modules/datalist}/DataListFragment.kt (61%) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListViewModel.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataSelectionDialogFragment.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 516c5ff1..56a36a3b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -118,7 +118,7 @@ android:screenOrientation="portrait" /> 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 322ea5c5..6901c8c0 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -1,10 +1,15 @@ package net.pokeranalytics.android.model import android.content.Context +import androidx.fragment.app.Fragment import io.realm.Realm +import io.realm.Sort 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.activity.EditableDataActivity +import net.pokeranalytics.android.ui.modules.handhistory.HandHistoryActivity import net.pokeranalytics.android.ui.view.Localizable import net.pokeranalytics.android.util.extensions.findById @@ -22,7 +27,8 @@ enum class LiveData : Localizable { FILTER, CUSTOM_FIELD, REPORT_SETUP, - PLAYER; + PLAYER, + HAND_HISTORY; var subType:Int? = null @@ -40,6 +46,7 @@ enum class LiveData : Localizable { CUSTOM_FIELD -> CustomField::class.java REPORT_SETUP -> ReportSetup::class.java PLAYER -> Player::class.java + HAND_HISTORY -> HandHistory::class.java } } @@ -81,6 +88,7 @@ enum class LiveData : Localizable { CUSTOM_FIELD -> R.string.custom_field REPORT_SETUP -> R.string.custom PLAYER -> R.string.player + HAND_HISTORY -> R.string.hand_history } } @@ -98,6 +106,7 @@ enum class LiveData : Localizable { CUSTOM_FIELD -> R.string.custom_fields REPORT_SETUP -> R.string.custom PLAYER -> R.string.players + HAND_HISTORY -> R.string.hands_history } } @@ -115,10 +124,17 @@ enum class LiveData : Localizable { CUSTOM_FIELD -> R.string.new_custom_field REPORT_SETUP -> R.string.new_report PLAYER -> R.string.new_friend + HAND_HISTORY -> R.string.new_hand } } - + val isSearchable: Boolean + get() { + return when (this) { + PLAYER, LOCATION -> true + else -> false + } + } /** * Return the new entity titleResId @@ -141,4 +157,33 @@ enum class LiveData : Localizable { return context.getString(this.pluralResId, context) } + fun openEditActivity(fragment: Fragment, primaryKey: String? = null, requestCode: Int) { + when (this) { + HAND_HISTORY -> { + HandHistoryActivity.newInstance(fragment, primaryKey) + } + else -> { + EditableDataActivity.newInstanceForResult(fragment, this, primaryKey, requestCode) + } + } + } + + val sortFields: Array + get() { + return when (this) { + TRANSACTION, HAND_HISTORY -> arrayOf("date") + FILTER -> arrayOf("useCount", "name") + else -> arrayOf("name") + } + } + + val sortOrders: Array + get() { + return when (this) { + TRANSACTION, HAND_HISTORY -> arrayOf(Sort.DESCENDING) + FILTER -> arrayOf(Sort.DESCENDING, Sort.ASCENDING) + else -> arrayOf(Sort.ASCENDING) + } + } + } 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 543c2378..5c85dcf5 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 @@ -268,9 +268,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat // The number of tables played at the same time var numberOfTables: Int = 1 - // The hands list associated with the Session // var hands: RealmList = RealmList() + // The hand histories of the session @LinkingObjects("session") val handHistories: RealmResults? = null @@ -823,6 +823,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat } } SessionRow.TOURNAMENT_NAME -> tournamentName?.name ?: NULL_TEXT + SessionRow.HANDS -> this.handHistories?.size.toString() ?: NULL_TEXT is CustomField -> { customFieldEntries.find { it.customField?.id == row.id }?.let { customFieldEntry -> return customFieldEntry.getFormattedValue(currency) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt index 4e287b32..788ac1cb 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.AppCompatTextView +import io.realm.Realm import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.Ignore @@ -14,18 +15,21 @@ import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.handhistory.HandSetup import net.pokeranalytics.android.model.handhistory.Position import net.pokeranalytics.android.model.handhistory.Street +import net.pokeranalytics.android.model.interfaces.Deletable +import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.TimeFilterable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.modules.handhistory.model.ActionReadRow import net.pokeranalytics.android.ui.modules.handhistory.model.CardHolder import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.extensions.addLineReturn import net.pokeranalytics.android.util.extensions.formatted import net.pokeranalytics.android.util.extensions.fullDate import java.util.* -open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterable, TimeFilterable, +open class HandHistory : RealmObject(), Deletable, RowRepresentable, Identifiable, Filterable, TimeFilterable, CardHolder { @PrimaryKey @@ -116,6 +120,22 @@ open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterab override var year: Int? = null override var dayOfMonth: Int? = null + // Deletable + + override fun isValidForDelete(realm: Realm): Boolean { + return true + } + + override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun deleteDependencies(realm: Realm) { + this.board.deleteAllFromRealm() + this.playerSetups.deleteAllFromRealm() + this.actions.deleteAllFromRealm() + } + /*** * Configures a hand history with a [handSetup] */ @@ -247,6 +267,9 @@ open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterab return this.anteSum + sortedActions.take(firstIndexOfStreet).sumByDouble { it.effectiveAmount } } + @Ignore + override val viewType: Int = RowViewType.HAND_HISTORY.ordinal + override fun localizedString(context: Context): CharSequence { val positions = Position.positionsPerPlayers(this.numberOfPlayers) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt deleted file mode 100644 index 7886348e..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt +++ /dev/null @@ -1,78 +0,0 @@ -package net.pokeranalytics.android.ui.activity - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import androidx.fragment.app.Fragment -import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.LiveData -import net.pokeranalytics.android.ui.activity.components.BaseActivity -import net.pokeranalytics.android.ui.activity.components.RequestCode -import net.pokeranalytics.android.ui.fragment.DataListFragment -import net.pokeranalytics.android.ui.fragment.DataSelectionDialogFragment -import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode - -class DataListActivity : BaseActivity() { - - enum class IntentKey(val keyName: String) { - DATA_TYPE("DATA_TYPE"), - LIVE_DATA_TYPE("LIVE_DATA_TYPE"), - ITEM_DELETED("ITEM_DELETED"), - SHOW_ADD_BUTTON("SHOW_ADD_BUTTON"), - SELECTION_DIALOG("DIALOG") - } - - companion object { - fun newInstance(context: Context, dataType: Int) { - context.startActivity(getIntent(context, dataType)) - } - - fun newSelectInstance(fragment: Fragment, dataType: Int, showAddButton: Boolean = true) { - val context = fragment.requireContext() - fragment.startActivityForResult(getIntent(context, dataType, showAddButton), FilterActivityRequestCode.SELECT_FILTER.ordinal) - } - - fun newSelectionDialogInstance(fragment: Fragment, dataType: LiveData) { - val context = fragment.requireContext() - fragment.startActivityForResult(getIntent(context, dataType.ordinal, false, true), RequestCode.PLAYER_SELECTION.ordinal) - } - - private fun getIntent(context: Context, dataType: Int, showAddButton: Boolean = true, dialog: Boolean = false): Intent { - val intent = Intent(context, DataListActivity::class.java) - intent.putExtra(IntentKey.DATA_TYPE.keyName, dataType) - intent.putExtra(IntentKey.SHOW_ADD_BUTTON.keyName, showAddButton) - intent.putExtra(IntentKey.SELECTION_DIALOG.keyName, dialog) - return intent - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_data_list) - - initUI() - } - - /** - * Init UI - */ - private fun initUI() { - val dataType = intent.getIntExtra(IntentKey.DATA_TYPE.keyName, 0) - val showAddButton = intent.getBooleanExtra(IntentKey.SHOW_ADD_BUTTON.keyName, true) - val dialog = intent.getBooleanExtra(IntentKey.SELECTION_DIALOG.keyName, true) - - if (dialog) { - val dataSelectionDialogFragment = DataSelectionDialogFragment.newInstance(dataType) - this.showFragment(dataSelectionDialogFragment, R.id.container) - } else { - val dataListFragment = DataListFragment() - dataListFragment.setData(dataType) - dataListFragment.updateUI(showAddButton) - } - -// val fragment = dataListFragment as DataListFragment -// fragment.setData(dataType) -// fragment.updateUI(showAddButton) - } - -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersListActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersListActivity.kt index 1dc842c7..47f9aab5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersListActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersListActivity.kt @@ -4,14 +4,21 @@ import android.content.Context import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProviders import kotlinx.android.synthetic.main.activity_filters_list.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.activity.components.BaseActivity import net.pokeranalytics.android.ui.fragment.FiltersListFragment import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode +import net.pokeranalytics.android.ui.modules.datalist.DataListViewModel class FiltersListActivity : BaseActivity() { + val model: DataListViewModel by lazy { + ViewModelProviders.of(this).get(DataListViewModel::class.java) + } + enum class IntentKey(val keyName: String) { DATA_TYPE("DATA_TYPE"), LIVE_DATA_TYPE("LIVE_DATA_TYPE"), @@ -51,8 +58,12 @@ class FiltersListActivity : BaseActivity() { val dataType = intent.getIntExtra(IntentKey.DATA_TYPE.keyName, 0) val showAddButton = intent.getBooleanExtra(IntentKey.SHOW_ADD_BUTTON.keyName, true) val fragment = filtersListFragment as FiltersListFragment - fragment.setData(dataType) - fragment.updateUI(showAddButton) + + this.model.dataType = LiveData.values()[dataType] + this.model.showAddButton = showAddButton + +// fragment.setData(dataType) +// fragment.updateUI(showAddButton) } } \ No newline at end of file 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 72fcc72d..32d01d4d 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 @@ -104,7 +104,7 @@ abstract class BaseActivity : AppCompatActivity() { fun showFragment(fragment: Fragment, containerId: Int) { val fragmentTransaction = supportFragmentManager.beginTransaction() - fragmentTransaction.add(containerId, fragment) + fragmentTransaction.replace(containerId, fragment) fragmentTransaction.commit() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt index e19cfebc..bbbd56ab 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt @@ -6,13 +6,13 @@ import android.view.ViewGroup import androidx.appcompat.widget.AppCompatTextView import androidx.recyclerview.widget.RecyclerView import io.realm.RealmResults -import kotlinx.android.synthetic.main.row_hand_history.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.handhistory.HandHistory +import net.pokeranalytics.android.ui.modules.handhistory.views.RowHandHistoryViewHolder import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.extensions.getMonthAndYear -import timber.log.Timber import java.util.* import kotlin.collections.HashMap @@ -35,27 +35,27 @@ class FeedHandHistoryRowRepresentableAdapter( refreshData() } - inner class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), - BindableHolder { - -// override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { +// inner class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), +// BindableHolder { +// +//// override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { +//// itemView.handHistoryRow.setData(row as HandHistory) +//// val listener = View.OnClickListener { +//// adapter.delegate?.onRowSelected(position, row) +//// } +//// itemView.handHistoryRow.setOnClickListener(listener) +//// } +// +// fun bind(position: Int, row: HandHistory?, adapter: FeedHandHistoryRowRepresentableAdapter) { +// // itemView.handHistoryRow.setData(row as HandHistory) // val listener = View.OnClickListener { // adapter.delegate?.onRowSelected(position, row) // } // itemView.handHistoryRow.setOnClickListener(listener) // } - - fun bind(position: Int, row: HandHistory?, adapter: FeedHandHistoryRowRepresentableAdapter) { - - itemView.handHistoryRow.setData(row as HandHistory) - val listener = View.OnClickListener { - adapter.delegate?.onRowSelected(position, row) - } - itemView.handHistoryRow.setOnClickListener(listener) - } - - } +// +// } /** * Display a header @@ -96,7 +96,8 @@ class FeedHandHistoryRowRepresentableAdapter( override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is RowHandHistoryViewHolder) { - holder.bind(position, getHandHistoryForPosition(position), this) + val hh = getHandHistoryForPosition(position) ?: throw PAIllegalStateException("Should not happen") + holder.bind(position, hh, this.delegate) } else if (holder is HeaderTitleViewHolder) { holder.bind(getHeaderForPosition(position)) } @@ -155,8 +156,7 @@ class FeedHandHistoryRowRepresentableAdapter( this.sortedHeaders = this.headersPositions.toSortedMap() - Timber.d("]]] this.sortedHeaders = ${this.sortedHeaders}") - +// Timber.d("]]] this.sortedHeaders = ${this.sortedHeaders}") } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt index bf2d824e..783c215a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt @@ -14,7 +14,7 @@ import net.pokeranalytics.android.calculus.bankroll.BankrollReportManager import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.realm.Bankroll -import net.pokeranalytics.android.ui.activity.DataListActivity +import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt index 4cbf41c2..9c9619de 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt @@ -20,7 +20,7 @@ import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.ui.activity.BankrollDetailsActivity -import net.pokeranalytics.android.ui.activity.DataListActivity +import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.GraphActivity import net.pokeranalytics.android.ui.activity.components.RequestCode diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataSelectionDialogFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataSelectionDialogFragment.kt deleted file mode 100644 index 145500b7..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataSelectionDialogFragment.kt +++ /dev/null @@ -1,52 +0,0 @@ -package net.pokeranalytics.android.ui.fragment - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.DialogFragment -import kotlinx.android.synthetic.main.fragment_data_selection_dialog.* -import net.pokeranalytics.android.R -import net.pokeranalytics.android.exceptions.PAIllegalStateException - -class DataSelectionDialogFragment : DialogFragment() { - - private enum class BundleKey(var value: String) { - DATA_TYPE("data_type") - } - - companion object { - - fun newInstance(dataType: Int): DataSelectionDialogFragment { - val df = DataSelectionDialogFragment() - val bundle = Bundle() - bundle.putSerializable(BundleKey.DATA_TYPE.value, dataType) - df.arguments = bundle - return df - } - - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_data_selection_dialog, container, false) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initDataListFragment() - } - - private fun initDataListFragment() { - - val dataListFragment = this.dataListFragment as DataListFragment - val dataType = this.arguments?.getInt(BundleKey.DATA_TYPE.value) ?: throw PAIllegalStateException("undefined datatype") - dataListFragment.setData(dataType) - - } - -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt index 8c597b56..5f44574a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt @@ -31,6 +31,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.FilterableFragment import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterableType +import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.modules.handhistory.HandHistoryActivity import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersListFragment.kt index 1357dba4..35b4d29f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersListFragment.kt @@ -3,64 +3,57 @@ package net.pokeranalytics.android.ui.fragment import android.app.Activity import android.content.Context import android.content.Intent -import io.realm.RealmResults -import net.pokeranalytics.android.model.LiveData -import net.pokeranalytics.android.model.interfaces.Deletable -import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.realm.Filter -import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.interfaces.FilterHandler.Companion.INTENT_FILTER_UPDATE_FILTER_UI +import net.pokeranalytics.android.ui.modules.datalist.DataListFragment import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor -import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.Preferences -import timber.log.Timber open class FiltersListFragment : DataListFragment() { - private var identifiableClass: Class = Filter::class.java - private var dataType: LiveData = LiveData.FILTER - private lateinit var items: RealmResults - - /** - * Set fragment data - */ - override fun setData(dataType: Int) { - super.setData(dataType) - - this.dataType = LiveData.FILTER - this.identifiableClass = Filter::class.java - setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext())) - this.items = this.retrieveItems(getRealm()) as RealmResults - } - - override fun rowRepresentableForPosition(position: Int): RowRepresentable? { - Timber.d("rowRepresentableForPosition: ${this.items[position] as RowRepresentable}") - return this.items[position] as RowRepresentable - } - - override fun numberOfRows(): Int { - return this.items.size - } - - override fun adapterRows(): List? { - return items - } - - override fun viewTypeForPosition(position: Int): Int { - val viewType = (this.items[position] as RowRepresentable).viewType - return if (viewType != -1) viewType else RowViewType.DATA.ordinal - } - - override fun editDescriptors(row: RowRepresentable): List? { - return when (row) { - is Filter -> row.editingDescriptors(mapOf("defaultValue" to row.name)) - else -> super.editDescriptors(row) - } - } +// private var identifiableClass: Class = Filter::class.java +// private var dataType: LiveData = LiveData.FILTER +// private lateinit var items: RealmResults +// +// /** +// * Set fragment data +// */ +// override fun setData(dataType: Int) { +// super.setData(dataType) +// +// this.dataType = LiveData.FILTER +// this.identifiableClass = Filter::class.java +// setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext())) +// this.items = this.retrieveItems(getRealm()) as RealmResults +// } +// +// override fun rowRepresentableForPosition(position: Int): RowRepresentable? { +// Timber.d("rowRepresentableForPosition: ${this.items[position] as RowRepresentable}") +// return this.items[position] as RowRepresentable +// } +// +// override fun numberOfRows(): Int { +// return this.items.size +// } +// +// override fun adapterRows(): List? { +// return items +// } +// +// override fun viewTypeForPosition(position: Int): Int { +// val viewType = (this.items[position] as RowRepresentable).viewType +// return if (viewType != -1) viewType else RowViewType.DATA.ordinal +// } +// +// override fun editDescriptors(row: RowRepresentable): List? { +// return when (row) { +// is Filter -> row.editingDescriptors(mapOf("defaultValue" to row.name)) +// else -> super.editDescriptors(row) +// } +// } override fun onRowValueChanged(value: Any?, row: RowRepresentable) { when (row) { @@ -77,7 +70,7 @@ open class FiltersListFragment : DataListFragment() { when (row) { is Filter -> { val filterId = row.id - deleteItem(dataListAdapter, items, filterId) + deleteItem(dataListAdapter, this.model.items, filterId) if (filterId == Preferences.getActiveFilterId(requireContext())) { Preferences.setActiveFilterId("", requireContext()) updateFilterUIIfNecessary(requireContext(), "") @@ -101,8 +94,9 @@ open class FiltersListFragment : DataListFragment() { } } else -> { - val identifier = (row as Identifiable).id - EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS) + super.onRowSelected(position, row, tag) +// val identifier = (row as Identifiable).id +// EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS) } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt index 90535845..499f0e95 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt @@ -22,7 +22,7 @@ import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.realm.ReportSetup -import net.pokeranalytics.android.ui.activity.DataListActivity +import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.activity.ReportCreationActivity import net.pokeranalytics.android.ui.activity.components.ReportActivity import net.pokeranalytics.android.ui.activity.components.RequestCode 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 0f3eddb4..ec5f414c 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 @@ -27,6 +27,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.helpers.DateTimePickerManager +import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.modules.handhistory.HandHistoryActivity import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableDiffCallback @@ -223,6 +224,10 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate { SessionRow.BANKROLL -> { BottomSheetFragment.create(fragmentManager, row, this, data, false, currentSession.currency) } + SessionRow.HANDS -> { + val hhIds = this.currentSession.handHistories?.map { it.id }?.toTypedArray() + DataListActivity.newDialogInstance(this, LiveData.HAND_HISTORY, false, hhIds) + } else -> BottomSheetFragment.create(fragmentManager, row, this, data, currentCurrency = currentSession.currency) } } 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 c89cd8e3..0b41bc10 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 @@ -26,6 +26,7 @@ import net.pokeranalytics.android.ui.extensions.openContactMail import net.pokeranalytics.android.ui.extensions.openPlayStorePage import net.pokeranalytics.android.ui.extensions.openUrl import net.pokeranalytics.android.ui.fragment.components.BaseFragment +import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow import net.pokeranalytics.android.util.Preferences diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt index 9136dac1..a527b94c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt @@ -15,7 +15,7 @@ import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.interfaces.Deletable -import net.pokeranalytics.android.ui.activity.DataListActivity +import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter /** 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 ea95564e..c45a4cff 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 @@ -13,7 +13,7 @@ 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.activity.DataListActivity +import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.viewmodel.DataManagerViewModel diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListActivity.kt new file mode 100644 index 00000000..239a5dc0 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListActivity.kt @@ -0,0 +1,113 @@ +package net.pokeranalytics.android.ui.modules.datalist + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProviders +import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.ui.activity.components.BaseActivity +import net.pokeranalytics.android.ui.activity.components.RequestCode +import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode + +class DataListActivity : BaseActivity() { + + val model: DataListViewModel by lazy { + ViewModelProviders.of(this).get(DataListViewModel::class.java) + } + + enum class IntentKey(val keyName: String) { + DATA_TYPE("data_type"), + LIVE_DATA_TYPE("LIVE_DATA_TYPE"), + ITEM_DELETED("item_deleted"), + SHOW_ADD_BUTTON("show_add_button"), + DIALOG("dialog"), + ITEM_IDS("item_ids"), + DATA_SELECTION("selection") + } + + companion object { + fun newInstance(context: Context, dataType: Int) { + context.startActivity( + getIntent( + context, + dataType + ) + ) + } + + fun newSelectInstance(fragment: Fragment, dataType: Int, showAddButton: Boolean = true) { + val context = fragment.requireContext() + fragment.startActivityForResult( + getIntent( + context, + dataType, + showAddButton + ), FilterActivityRequestCode.SELECT_FILTER.ordinal) + } + + fun newDialogInstance(fragment: Fragment, dataType: LiveData, selection: Boolean, itemIds: Array? = null) { + val context = fragment.requireContext() + fragment.startActivityForResult( + getIntent( + context, + dataType.ordinal, + false, + true, + selection, + itemIds + ), RequestCode.PLAYER_SELECTION.ordinal) + } + + private fun getIntent(context: Context, dataType: Int, showAddButton: Boolean = true, dialog: Boolean = false, selection: Boolean = false, itemIds: Array? = null): Intent { + val intent = Intent(context, DataListActivity::class.java) + intent.putExtra(IntentKey.DATA_TYPE.keyName, dataType) + intent.putExtra(IntentKey.SHOW_ADD_BUTTON.keyName, showAddButton) + intent.putExtra(IntentKey.DIALOG.keyName, dialog) + intent.putExtra(IntentKey.DATA_SELECTION.keyName, selection) + intent.putExtra(IntentKey.ITEM_IDS.keyName, itemIds) + return intent + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_data_list) + + initUI() + } + + /** + * Init UI + */ + private fun initUI() { + val dataType = intent.getIntExtra(IntentKey.DATA_TYPE.keyName, 0) + val showAddButton = intent.getBooleanExtra(IntentKey.SHOW_ADD_BUTTON.keyName, true) + val dialog = intent.getBooleanExtra(IntentKey.DIALOG.keyName, true) + val selection = intent.getBooleanExtra(IntentKey.DATA_SELECTION.keyName, false) + val itemIds = intent.getStringArrayExtra(IntentKey.ITEM_IDS.keyName) + + this.model.dataType = LiveData.values()[dataType] + this.model.isSelectionInstance = selection + this.model.showAddButton = showAddButton + this.model.itemIds = itemIds + + val dataListFragment = DataListFragment() + + val fragment = if (dialog) { + val dataSelectionDialogFragment = DataSelectionDialogFragment() + showFragment(dataSelectionDialogFragment, R.id.container) + dataSelectionDialogFragment.showFragment(dataListFragment) + } else { + showFragment(dataListFragment, R.id.container) + } + + + +// val fragment = dataListFragment as DataListFragment +// fragment.setData(dataType) +// fragment.updateUI(showAddButton) + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListFragment.kt similarity index 61% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListFragment.kt index 8da129be..f0c261c9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListFragment.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.ui.fragment +package net.pokeranalytics.android.ui.modules.datalist import android.app.Activity import android.content.Intent @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.* import androidx.appcompat.widget.SearchView import androidx.core.view.isVisible +import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import io.realm.Realm @@ -19,66 +20,37 @@ import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.FiltersActivity -import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.extensions.removeMargins import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.extensions.find import net.pokeranalytics.android.util.extensions.sorted -open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { +open class DataListFragment : DeletableItemFragment(), RowRepresentableDelegate { + + val model: DataListViewModel by lazy { + ViewModelProviders.of(requireActivity()).get(DataListViewModel::class.java) + } companion object { const val REQUEST_CODE_DETAILS = 1000 } - private lateinit var identifiableClass: Class - - private lateinit var dataType: LiveData - private lateinit var items: RealmResults - private var dataListMenu: Menu? = null + private var menu: Menu? = null private var searchView: SearchView? = null - /*** - * Returns the selected item on row selection - */ - private var isSelectionInstance: Boolean = false - - private var isSearchable: Boolean = false - set(value) { - field = value - val searchMenuItem = dataListMenu?.findItem(R.id.action_search) - searchMenuItem?.isVisible = value - } - - /** - * Set fragment data - */ - open fun setData(dataType: Int) { - - this.dataType = LiveData.values()[dataType] - this.identifiableClass = this.dataType.relatedEntity - setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext())) - - this.items = this.retrieveItems(getRealm()) - - this.isSearchable = when (this.dataType) { - LiveData.PLAYER, LiveData.LOCATION -> true - else -> false - } - } - open fun retrieveItems(realm: Realm): RealmResults { - return realm.sorted(this.identifiableClass, editableOnly = true, filterableTypeUniqueIdentifier = dataType.subType) + return realm.sorted(this.model.identifiableClass, + editableOnly = true, + filterableTypeUniqueIdentifier = this.model.dataType.subType) } override fun deletableItems() : List { - return this.items + return this.model.items } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -88,24 +60,44 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + initData() initUI() } + fun initData() { + + val itemIds = this.model.itemIds + val items = if (itemIds?.isNotEmpty() == true) { + getRealm().where(this.model.identifiableClass) + .`in`("id", itemIds) + .sort(this.model.dataType.sortFields, this.model.dataType.sortOrders) + .findAll() + } else { + this.retrieveItems(getRealm()) + } + this.model.setItemsList(items) + } + /** * Init UI */ private fun initUI() { + val searchMenuItem = this.menu?.findItem(R.id.action_search) + searchMenuItem?.isVisible = this.model.isSearchable + + setToolbarTitle(this.model.dataType.pluralLocalizedTitle(requireContext())) + setDisplayHomeAsUpEnabled(true) val viewManager = LinearLayoutManager(requireContext()) - this.dataListAdapter = RowRepresentableAdapter(this, this) + this.dataListAdapter = RowRepresentableAdapter(this.model, this) - val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position -> - val item = this.items[position] + val swipeToDelete = SwipeToDeleteCallback(this.dataListAdapter) { position -> + val item = this.model.items[position] if (item != null) { val itemId = item.id - deleteItem(dataListAdapter, items, itemId) + deleteItem(this.dataListAdapter, this.model.items, itemId) } else { throw PAIllegalStateException("Item with position $position not found") } @@ -123,10 +115,13 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS this.addButton.setOnClickListener { EditableDataActivity.newInstance( requireContext(), - dataType = this.dataType.ordinal, + dataType = this.model.dataType.ordinal, primaryKey = null ) } + + this.addButton.isVisible = this.model.showAddButton + } override fun onResume() { @@ -138,14 +133,14 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS menu.clear() inflater.inflate(R.menu.toolbar_data_list, menu) - this.dataListMenu = menu + this.menu = menu val searchMenuItem = menu.findItem(R.id.action_search) - searchMenuItem.isVisible = isSearchable + searchMenuItem.isVisible = this.model.isSearchable - searchView = searchMenuItem.actionView as SearchView? - searchView?.removeMargins() - searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + this.searchView = searchMenuItem.actionView as SearchView? + this.searchView?.removeMargins() + this.searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { return false } @@ -159,22 +154,9 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS super.onCreateOptionsMenu(menu, inflater) } - override fun rowRepresentableForPosition(position: Int): RowRepresentable? { - return this.items[position] as RowRepresentable - } - - override fun numberOfRows(): Int { - return this.items.size - } - - override fun viewTypeForPosition(position: Int): Int { - val viewType = (this.items[position] as RowRepresentable).viewType - return if (viewType != -1) viewType else RowViewType.DATA.ordinal - } - override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { - if (this.isSelectionInstance) { + if (this.model.isSelectionInstance) { // Ends the activity and go back to previous screen val identifier = (row as Identifiable).id val intent = Intent() intent.putExtra(BundleKey.PRIMARY_KEY.value, identifier) @@ -182,7 +164,7 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS this.activity?.finish() } else { - when (this.dataType) { + when (this.model.dataType) { LiveData.FILTER -> { val intent = Intent() intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) @@ -191,25 +173,19 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS } else -> { val identifier = (row as Identifiable).id - EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS) + this.model.dataType.openEditActivity(this, identifier, REQUEST_CODE_DETAILS) } } } } - /** - * Update UI - */ - fun updateUI(showAddButton: Boolean) { - this.addButton.isVisible = showAddButton - } - /** * Filter the items list with the given search content */ private fun filterItemsWithSearch(searchContent: String?) { - this.items = getRealm().find(this.identifiableClass, searchContent) + val items = getRealm().find(this.model.identifiableClass, searchContent) + this.model.setItemsList(items) this.dataListAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListViewModel.kt new file mode 100644 index 00000000..eaa8a6b8 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListViewModel.kt @@ -0,0 +1,55 @@ +package net.pokeranalytics.android.ui.modules.datalist + +import androidx.lifecycle.ViewModel +import io.realm.RealmResults +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.interfaces.Deletable +import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + +class DataListViewModel : ViewModel(), LiveRowRepresentableDataSource { + + /*** + * The managed data type + */ + lateinit var dataType: LiveData + + /*** + * Returns the selected item on row selection + */ + var isSelectionInstance: Boolean = false + + lateinit var items: RealmResults + + /*** + * The item ids to load + */ + var itemIds: Array? = null + + val isSearchable: Boolean + get() { return this.dataType.isSearchable } + + val identifiableClass: Class + get() { return this.dataType.relatedEntity } + + var showAddButton: Boolean = false + + override fun rowRepresentableForPosition(position: Int): RowRepresentable? { + return this.items[position] as RowRepresentable + } + + override fun numberOfRows(): Int { + return this.items.size + } + + override fun viewTypeForPosition(position: Int): Int { + val viewType = (this.items[position] as RowRepresentable).viewType + return if (viewType != -1) viewType else RowViewType.DATA.ordinal + } + + fun setItemsList(items: RealmResults) { + this.items = items + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataSelectionDialogFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataSelectionDialogFragment.kt new file mode 100644 index 00000000..3465a2e3 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataSelectionDialogFragment.kt @@ -0,0 +1,59 @@ +package net.pokeranalytics.android.ui.modules.datalist + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import net.pokeranalytics.android.R + +class DataSelectionDialogFragment : DialogFragment() { + + private enum class BundleKey(var value: String) { + DATA_TYPE("data_type"), + ITEM_IDS("item_ids") + } + + companion object { + + fun newInstance(): DataSelectionDialogFragment { + val df = DataSelectionDialogFragment() + return df + } + + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + super.onCreateView(inflater, container, savedInstanceState) + return inflater.inflate(R.layout.fragment_data_selection_dialog, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) +// initDataListFragment() + } + +// private fun initDataListFragment() { +//// +//// val dataListFragment = +//// DataListFragment() +//// val dataType = this.arguments?.getInt(BundleKey.DATA_TYPE.value) ?: throw PAIllegalStateException("undefined datatype") +//// val itemIds = this.arguments?.getStringArray(BundleKey.ITEM_IDS.value) +//// dataListFragment.setData(dataType, itemIds) +//// +//// showFragment(dataListFragment) +//// +//// } + + fun showFragment(fragment: Fragment) { + val fragmentTransaction = requireFragmentManager().beginTransaction() + fragmentTransaction.replace(R.id.container, fragment) + fragmentTransaction.commit() + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryActivity.kt index b93246b2..7f52305f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryActivity.kt @@ -45,11 +45,13 @@ class HandHistoryActivity : BaseActivity() { */ private fun initUI() { - val fragmentTransaction = supportFragmentManager.beginTransaction() - val handHistoryId = intent.getStringExtra(IntentKey.IDENTIFIER.keyName) val sessionId = intent.getStringExtra(IntentKey.SESSION_CONFIGURATION.keyName) - val fragment = HandHistoryFragment.newInstance(handHistoryId, sessionId) + val attached = intent.getBooleanExtra(IntentKey.ATTACHED.keyName, false) + + val fragment = HandHistoryFragment.newInstance(handHistoryId, sessionId, attached) + + val fragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.add(R.id.container, fragment) fragmentTransaction.commit() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt index 7611cec0..36d13cae 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt @@ -19,7 +19,6 @@ import net.pokeranalytics.android.model.realm.Player import net.pokeranalytics.android.model.realm.handhistory.Action import net.pokeranalytics.android.model.realm.handhistory.Card import net.pokeranalytics.android.model.realm.handhistory.HandHistory -import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.extensions.px @@ -27,6 +26,7 @@ import net.pokeranalytics.android.ui.fragment.components.BaseFragment import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType +import net.pokeranalytics.android.ui.modules.datalist.DataListActivity import net.pokeranalytics.android.ui.modules.handhistory.model.* import net.pokeranalytics.android.ui.modules.handhistory.views.KeyboardListener import net.pokeranalytics.android.ui.view.RowRepresentable @@ -384,7 +384,7 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL when (tag) { PlayerSetupRow.Tag.PLAYER.ordinal -> { this.model.clickPosition = position - DataListActivity.newSelectionDialogInstance(this, LiveData.PLAYER) + DataListActivity.newDialogInstance(this, LiveData.PLAYER, true) } else -> { Timber.d("onItemClick not configured for row: $row, position: $position, tag: $tag") diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt index f27573fe..d5515605 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt @@ -2,23 +2,39 @@ package net.pokeranalytics.android.ui.modules.handhistory.views import android.view.View import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.row_hand_history.view.* +import kotlinx.android.synthetic.main.row_hand_history_view.view.* +import net.pokeranalytics.android.model.handhistory.Street import net.pokeranalytics.android.model.realm.handhistory.HandHistory import net.pokeranalytics.android.ui.adapter.BindableHolder import net.pokeranalytics.android.ui.adapter.RecyclerAdapter +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.util.extensions.formatted class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { + this.bind(position, row, adapter.delegate) + } - itemView.handHistoryRow.setData(row as HandHistory) - val listener = View.OnClickListener { - adapter.delegate?.onRowSelected(position, row) + fun bind(position: Int, row: RowRepresentable, delegate: RowRepresentableDelegate?) { + + val handHistory = row as HandHistory + + itemView.cardsLayout.removeAllViews() + + handHistory.cardViews(itemView.context, itemView.cardsLayout).forEach { view -> + itemView.cardsLayout.addView(view) } - itemView.handHistoryRow.setOnClickListener(listener) + itemView.amount.text = handHistory.potSizeForStreet(Street.SUMMARY).formatted() + +// itemView.handHistoryRow.setData(handHistory) + val listener = View.OnClickListener { + delegate?.onRowSelected(position, row) + } + itemView.constraintLayout.setOnClickListener(listener) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt index 8772735e..e448218a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt @@ -37,7 +37,8 @@ enum class SessionRow : RowRepresentable { END_DATE, BREAK_TIME, - COMMENT; + COMMENT, + HANDS; companion object { /** @@ -62,14 +63,20 @@ enum class SessionRow : RowRepresentable { ) } SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { - arrayListOf( + val fields = mutableListOf() + fields.addAll(listOf( PRIZE, BUY_IN, POSITION, PLAYERS, - TIPS, - COMMENT, - SeparatorRow(), + TIPS)) + fields.add(SeparatorRow()) + fields.add(COMMENT) + if (session.handHistories?.isNotEmpty() == true) { + fields.add(HANDS) + } + fields.add(SeparatorRow()) + fields.addAll(listOf( GAME, INITIAL_BUY_IN, LOCATION, @@ -82,7 +89,8 @@ enum class SessionRow : RowRepresentable { START_DATE, END_DATE, BREAK_TIME - ) + )) + fields } } } @@ -100,7 +108,11 @@ enum class SessionRow : RowRepresentable { session.isLive -> fields.addAll(listOf(CASHED_OUT, BUY_IN, TIPS)) else -> fields.add(NET_RESULT) } + fields.add(SeparatorRow()) fields.add(COMMENT) + if (session.handHistories?.isNotEmpty() == true) { + fields.add(HANDS) + } fields.add(SeparatorRow()) fields.addAll(listOf( GAME, @@ -108,10 +120,10 @@ enum class SessionRow : RowRepresentable { LOCATION, BANKROLL, TABLE_SIZE, + SeparatorRow(), START_DATE, END_DATE, BREAK_TIME - ) ) return fields @@ -146,6 +158,7 @@ enum class SessionRow : RowRepresentable { END_DATE -> R.string.end_date BREAK_TIME -> R.string.break_time COMMENT -> R.string.comment + HANDS -> R.string.hands } } @@ -154,7 +167,8 @@ enum class SessionRow : RowRepresentable { return when (this) { NET_RESULT, PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS, GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, - TOURNAMENT_TYPE, TOURNAMENT_NAME, TOURNAMENT_FEATURE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal + TOURNAMENT_TYPE, TOURNAMENT_NAME, TOURNAMENT_FEATURE, HANDS, + START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal } } diff --git a/app/src/main/res/layout/activity_data_list.xml b/app/src/main/res/layout/activity_data_list.xml index 9cf654c0..4750c9ee 100644 --- a/app/src/main/res/layout/activity_data_list.xml +++ b/app/src/main/res/layout/activity_data_list.xml @@ -8,7 +8,7 @@ - + diff --git a/app/src/main/res/layout/fragment_data_selection_dialog.xml b/app/src/main/res/layout/fragment_data_selection_dialog.xml index c92bed59..6225b16c 100644 --- a/app/src/main/res/layout/fragment_data_selection_dialog.xml +++ b/app/src/main/res/layout/fragment_data_selection_dialog.xml @@ -4,10 +4,10 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_hand_history.xml b/app/src/main/res/layout/row_hand_history.xml index 8c0b0094..653c960f 100644 --- a/app/src/main/res/layout/row_hand_history.xml +++ b/app/src/main/res/layout/row_hand_history.xml @@ -5,9 +5,9 @@ android:orientation="vertical" android:padding="4dp"> - + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_hand_history_view.xml b/app/src/main/res/layout/row_hand_history_view.xml index 37cd2810..61c025f3 100644 --- a/app/src/main/res/layout/row_hand_history_view.xml +++ b/app/src/main/res/layout/row_hand_history_view.xml @@ -1,7 +1,9 @@ -