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 @@
-