View hands from Session

hh
Laurent 6 years ago
parent 4ff41f6391
commit bbc7d154ca
  1. 2
      app/src/main/AndroidManifest.xml
  2. 49
      app/src/main/java/net/pokeranalytics/android/model/LiveData.kt
  3. 3
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  4. 25
      app/src/main/java/net/pokeranalytics/android/model/realm/handhistory/HandHistory.kt
  5. 78
      app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt
  6. 15
      app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersListActivity.kt
  7. 2
      app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt
  8. 40
      app/src/main/java/net/pokeranalytics/android/ui/adapter/FeedHandHistoryRowRepresentableAdapter.kt
  9. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollDetailsFragment.kt
  10. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt
  11. 52
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataSelectionDialogFragment.kt
  12. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt
  13. 96
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersListFragment.kt
  14. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt
  15. 5
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  16. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt
  17. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt
  18. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt
  19. 113
      app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListActivity.kt
  20. 124
      app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListFragment.kt
  21. 55
      app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListViewModel.kt
  22. 59
      app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataSelectionDialogFragment.kt
  23. 8
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryActivity.kt
  24. 4
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt
  25. 26
      app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt
  26. 30
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt
  27. 2
      app/src/main/res/layout/activity_data_list.xml
  28. 10
      app/src/main/res/layout/fragment_data_selection_dialog.xml
  29. 8
      app/src/main/res/layout/row_hand_history.xml
  30. 4
      app/src/main/res/layout/row_hand_history_view.xml

@ -118,7 +118,7 @@
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity <activity
android:name="net.pokeranalytics.android.ui.activity.DataListActivity" android:name="net.pokeranalytics.android.ui.modules.datalist.DataListActivity"
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />

@ -1,10 +1,15 @@
package net.pokeranalytics.android.model package net.pokeranalytics.android.model
import android.content.Context import android.content.Context
import androidx.fragment.app.Fragment
import io.realm.Realm import io.realm.Realm
import io.realm.Sort
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Deletable
import net.pokeranalytics.android.model.realm.* 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.ui.view.Localizable
import net.pokeranalytics.android.util.extensions.findById import net.pokeranalytics.android.util.extensions.findById
@ -22,7 +27,8 @@ enum class LiveData : Localizable {
FILTER, FILTER,
CUSTOM_FIELD, CUSTOM_FIELD,
REPORT_SETUP, REPORT_SETUP,
PLAYER; PLAYER,
HAND_HISTORY;
var subType:Int? = null var subType:Int? = null
@ -40,6 +46,7 @@ enum class LiveData : Localizable {
CUSTOM_FIELD -> CustomField::class.java CUSTOM_FIELD -> CustomField::class.java
REPORT_SETUP -> ReportSetup::class.java REPORT_SETUP -> ReportSetup::class.java
PLAYER -> Player::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 CUSTOM_FIELD -> R.string.custom_field
REPORT_SETUP -> R.string.custom REPORT_SETUP -> R.string.custom
PLAYER -> R.string.player PLAYER -> R.string.player
HAND_HISTORY -> R.string.hand_history
} }
} }
@ -98,6 +106,7 @@ enum class LiveData : Localizable {
CUSTOM_FIELD -> R.string.custom_fields CUSTOM_FIELD -> R.string.custom_fields
REPORT_SETUP -> R.string.custom REPORT_SETUP -> R.string.custom
PLAYER -> R.string.players 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 CUSTOM_FIELD -> R.string.new_custom_field
REPORT_SETUP -> R.string.new_report REPORT_SETUP -> R.string.new_report
PLAYER -> R.string.new_friend 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 * Return the new entity titleResId
@ -141,4 +157,33 @@ enum class LiveData : Localizable {
return context.getString(this.pluralResId, context) 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<String>
get() {
return when (this) {
TRANSACTION, HAND_HISTORY -> arrayOf("date")
FILTER -> arrayOf("useCount", "name")
else -> arrayOf("name")
}
}
val sortOrders: Array<Sort>
get() {
return when (this) {
TRANSACTION, HAND_HISTORY -> arrayOf(Sort.DESCENDING)
FILTER -> arrayOf(Sort.DESCENDING, Sort.ASCENDING)
else -> arrayOf(Sort.ASCENDING)
}
}
} }

@ -268,9 +268,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
// The number of tables played at the same time // The number of tables played at the same time
var numberOfTables: Int = 1 var numberOfTables: Int = 1
// The hands list associated with the Session
// var hands: RealmList<HandHistory> = RealmList() // var hands: RealmList<HandHistory> = RealmList()
// The hand histories of the session
@LinkingObjects("session") @LinkingObjects("session")
val handHistories: RealmResults<HandHistory>? = null val handHistories: RealmResults<HandHistory>? = null
@ -823,6 +823,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
} }
} }
SessionRow.TOURNAMENT_NAME -> tournamentName?.name ?: NULL_TEXT SessionRow.TOURNAMENT_NAME -> tournamentName?.name ?: NULL_TEXT
SessionRow.HANDS -> this.handHistories?.size.toString() ?: NULL_TEXT
is CustomField -> { is CustomField -> {
customFieldEntries.find { it.customField?.id == row.id }?.let { customFieldEntry -> customFieldEntries.find { it.customField?.id == row.id }?.let { customFieldEntry ->
return customFieldEntry.getFormattedValue(currency) return customFieldEntry.getFormattedValue(currency)

@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import io.realm.Realm
import io.realm.RealmList import io.realm.RealmList
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.Ignore 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.HandSetup
import net.pokeranalytics.android.model.handhistory.Position import net.pokeranalytics.android.model.handhistory.Position
import net.pokeranalytics.android.model.handhistory.Street 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.Identifiable
import net.pokeranalytics.android.model.interfaces.TimeFilterable import net.pokeranalytics.android.model.interfaces.TimeFilterable
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.modules.handhistory.model.ActionReadRow import net.pokeranalytics.android.ui.modules.handhistory.model.ActionReadRow
import net.pokeranalytics.android.ui.modules.handhistory.model.CardHolder import net.pokeranalytics.android.ui.modules.handhistory.model.CardHolder
import net.pokeranalytics.android.ui.view.RowRepresentable 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.addLineReturn
import net.pokeranalytics.android.util.extensions.formatted import net.pokeranalytics.android.util.extensions.formatted
import net.pokeranalytics.android.util.extensions.fullDate import net.pokeranalytics.android.util.extensions.fullDate
import java.util.* import java.util.*
open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterable, TimeFilterable, open class HandHistory : RealmObject(), Deletable, RowRepresentable, Identifiable, Filterable, TimeFilterable,
CardHolder { CardHolder {
@PrimaryKey @PrimaryKey
@ -116,6 +120,22 @@ open class HandHistory : RealmObject(), RowRepresentable, Identifiable, Filterab
override var year: Int? = null override var year: Int? = null
override var dayOfMonth: 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] * 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 } return this.anteSum + sortedActions.take(firstIndexOfStreet).sumByDouble { it.effectiveAmount }
} }
@Ignore
override val viewType: Int = RowViewType.HAND_HISTORY.ordinal
override fun localizedString(context: Context): CharSequence { override fun localizedString(context: Context): CharSequence {
val positions = Position.positionsPerPlayers(this.numberOfPlayers) val positions = Position.positionsPerPlayers(this.numberOfPlayers)

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

@ -4,14 +4,21 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import kotlinx.android.synthetic.main.activity_filters_list.* import kotlinx.android.synthetic.main.activity_filters_list.*
import net.pokeranalytics.android.R 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.BaseActivity
import net.pokeranalytics.android.ui.fragment.FiltersListFragment import net.pokeranalytics.android.ui.fragment.FiltersListFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode
import net.pokeranalytics.android.ui.modules.datalist.DataListViewModel
class FiltersListActivity : BaseActivity() { class FiltersListActivity : BaseActivity() {
val model: DataListViewModel by lazy {
ViewModelProviders.of(this).get(DataListViewModel::class.java)
}
enum class IntentKey(val keyName: String) { enum class IntentKey(val keyName: String) {
DATA_TYPE("DATA_TYPE"), DATA_TYPE("DATA_TYPE"),
LIVE_DATA_TYPE("LIVE_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 dataType = intent.getIntExtra(IntentKey.DATA_TYPE.keyName, 0)
val showAddButton = intent.getBooleanExtra(IntentKey.SHOW_ADD_BUTTON.keyName, true) val showAddButton = intent.getBooleanExtra(IntentKey.SHOW_ADD_BUTTON.keyName, true)
val fragment = filtersListFragment as FiltersListFragment 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)
} }
} }

@ -104,7 +104,7 @@ abstract class BaseActivity : AppCompatActivity() {
fun showFragment(fragment: Fragment, containerId: Int) { fun showFragment(fragment: Fragment, containerId: Int) {
val fragmentTransaction = supportFragmentManager.beginTransaction() val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.add(containerId, fragment) fragmentTransaction.replace(containerId, fragment)
fragmentTransaction.commit() fragmentTransaction.commit()
} }

@ -6,13 +6,13 @@ import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.realm.RealmResults import io.realm.RealmResults
import kotlinx.android.synthetic.main.row_hand_history.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.realm.handhistory.HandHistory 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.ui.view.RowViewType
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.extensions.getMonthAndYear import net.pokeranalytics.android.util.extensions.getMonthAndYear
import timber.log.Timber
import java.util.* import java.util.*
import kotlin.collections.HashMap import kotlin.collections.HashMap
@ -35,27 +35,27 @@ class FeedHandHistoryRowRepresentableAdapter(
refreshData() refreshData()
} }
inner class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), // inner class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder { // BindableHolder {
//
// override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { //// 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) // itemView.handHistoryRow.setData(row as HandHistory)
// val listener = View.OnClickListener { // val listener = View.OnClickListener {
// adapter.delegate?.onRowSelected(position, row) // adapter.delegate?.onRowSelected(position, row)
// } // }
// itemView.handHistoryRow.setOnClickListener(listener) // 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 * Display a header
@ -96,7 +96,8 @@ class FeedHandHistoryRowRepresentableAdapter(
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is RowHandHistoryViewHolder) { 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) { } else if (holder is HeaderTitleViewHolder) {
holder.bind(getHeaderForPosition(position)) holder.bind(getHeaderForPosition(position))
} }
@ -155,8 +156,7 @@ class FeedHandHistoryRowRepresentableAdapter(
this.sortedHeaders = this.headersPositions.toSortedMap() this.sortedHeaders = this.headersPositions.toSortedMap()
Timber.d("]]] this.sortedHeaders = ${this.sortedHeaders}") // Timber.d("]]] this.sortedHeaders = ${this.sortedHeaders}")
} }

@ -14,7 +14,7 @@ import net.pokeranalytics.android.calculus.bankroll.BankrollReportManager
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.realm.Bankroll 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.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.activity.components.RequestCode
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter

@ -20,7 +20,7 @@ import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Deletable
import net.pokeranalytics.android.model.realm.Bankroll import net.pokeranalytics.android.model.realm.Bankroll
import net.pokeranalytics.android.ui.activity.BankrollDetailsActivity 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.EditableDataActivity
import net.pokeranalytics.android.ui.activity.GraphActivity import net.pokeranalytics.android.ui.activity.GraphActivity
import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.activity.components.RequestCode

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

@ -31,6 +31,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.FilterableFragment import net.pokeranalytics.android.ui.fragment.components.FilterableFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode
import net.pokeranalytics.android.ui.interfaces.FilterableType 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.modules.handhistory.HandHistoryActivity
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager

@ -3,64 +3,57 @@ package net.pokeranalytics.android.ui.fragment
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent 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.model.realm.Filter
import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment 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.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.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.Preferences
import timber.log.Timber
open class FiltersListFragment : DataListFragment() { open class FiltersListFragment : DataListFragment() {
private var identifiableClass: Class<out Deletable> = Filter::class.java // private var identifiableClass: Class<out Deletable> = Filter::class.java
private var dataType: LiveData = LiveData.FILTER // private var dataType: LiveData = LiveData.FILTER
private lateinit var items: RealmResults<Filter> // private lateinit var items: RealmResults<Filter>
//
/** // /**
* Set fragment data // * Set fragment data
*/ // */
override fun setData(dataType: Int) { // override fun setData(dataType: Int) {
super.setData(dataType) // super.setData(dataType)
//
this.dataType = LiveData.FILTER // this.dataType = LiveData.FILTER
this.identifiableClass = Filter::class.java // this.identifiableClass = Filter::class.java
setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext())) // setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext()))
this.items = this.retrieveItems(getRealm()) as RealmResults<Filter> // this.items = this.retrieveItems(getRealm()) as RealmResults<Filter>
} // }
//
override fun rowRepresentableForPosition(position: Int): RowRepresentable? { // override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
Timber.d("rowRepresentableForPosition: ${this.items[position] as RowRepresentable}") // Timber.d("rowRepresentableForPosition: ${this.items[position] as RowRepresentable}")
return this.items[position] as RowRepresentable // return this.items[position] as RowRepresentable
} // }
//
override fun numberOfRows(): Int { // override fun numberOfRows(): Int {
return this.items.size // return this.items.size
} // }
//
override fun adapterRows(): List<RowRepresentable>? { // override fun adapterRows(): List<RowRepresentable>? {
return items // return items
} // }
//
override fun viewTypeForPosition(position: Int): Int { // override fun viewTypeForPosition(position: Int): Int {
val viewType = (this.items[position] as RowRepresentable).viewType // val viewType = (this.items[position] as RowRepresentable).viewType
return if (viewType != -1) viewType else RowViewType.DATA.ordinal // return if (viewType != -1) viewType else RowViewType.DATA.ordinal
} // }
//
override fun editDescriptors(row: RowRepresentable): List<RowRepresentableEditDescriptor>? { // override fun editDescriptors(row: RowRepresentable): List<RowRepresentableEditDescriptor>? {
return when (row) { // return when (row) {
is Filter -> row.editingDescriptors(mapOf("defaultValue" to row.name)) // is Filter -> row.editingDescriptors(mapOf("defaultValue" to row.name))
else -> super.editDescriptors(row) // else -> super.editDescriptors(row)
} // }
} // }
override fun onRowValueChanged(value: Any?, row: RowRepresentable) { override fun onRowValueChanged(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
@ -77,7 +70,7 @@ open class FiltersListFragment : DataListFragment() {
when (row) { when (row) {
is Filter -> { is Filter -> {
val filterId = row.id val filterId = row.id
deleteItem(dataListAdapter, items, filterId) deleteItem(dataListAdapter, this.model.items, filterId)
if (filterId == Preferences.getActiveFilterId(requireContext())) { if (filterId == Preferences.getActiveFilterId(requireContext())) {
Preferences.setActiveFilterId("", requireContext()) Preferences.setActiveFilterId("", requireContext())
updateFilterUIIfNecessary(requireContext(), "") updateFilterUIIfNecessary(requireContext(), "")
@ -101,8 +94,9 @@ open class FiltersListFragment : DataListFragment() {
} }
} }
else -> { else -> {
val identifier = (row as Identifiable).id super.onRowSelected(position, row, tag)
EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS) // val identifier = (row as Identifiable).id
// EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS)
} }
} }
} }

@ -22,7 +22,7 @@ import net.pokeranalytics.android.model.Criteria
import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.combined
import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Deletable
import net.pokeranalytics.android.model.realm.ReportSetup 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.ReportCreationActivity
import net.pokeranalytics.android.ui.activity.components.ReportActivity import net.pokeranalytics.android.ui.activity.components.ReportActivity
import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.activity.components.RequestCode

@ -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.RealmFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.helpers.DateTimePickerManager 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.modules.handhistory.HandHistoryActivity
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableDiffCallback import net.pokeranalytics.android.ui.view.RowRepresentableDiffCallback
@ -223,6 +224,10 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate {
SessionRow.BANKROLL -> { SessionRow.BANKROLL -> {
BottomSheetFragment.create(fragmentManager, row, this, data, false, currentSession.currency) 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) else -> BottomSheetFragment.create(fragmentManager, row, this, data, currentCurrency = currentSession.currency)
} }
} }

@ -26,6 +26,7 @@ import net.pokeranalytics.android.ui.extensions.openContactMail
import net.pokeranalytics.android.ui.extensions.openPlayStorePage import net.pokeranalytics.android.ui.extensions.openPlayStorePage
import net.pokeranalytics.android.ui.extensions.openUrl import net.pokeranalytics.android.ui.extensions.openUrl
import net.pokeranalytics.android.ui.fragment.components.BaseFragment 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
import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow
import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.Preferences

@ -15,7 +15,7 @@ import kotlinx.coroutines.launch
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.interfaces.Deletable 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 import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
/** /**

@ -13,7 +13,7 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.ConfigurationException import net.pokeranalytics.android.exceptions.ConfigurationException
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus 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.activity.EditableDataActivity
import net.pokeranalytics.android.ui.fragment.components.RealmFragment import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.viewmodel.DataManagerViewModel import net.pokeranalytics.android.ui.viewmodel.DataManagerViewModel

@ -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<String>? = 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<String>? = 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)
}
}

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment package net.pokeranalytics.android.ui.modules.datalist
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
@ -6,6 +6,7 @@ import android.os.Bundle
import android.view.* import android.view.*
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.Realm 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.model.realm.Filter
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.FiltersActivity 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.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.extensions.removeMargins import net.pokeranalytics.android.ui.extensions.removeMargins
import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment
import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback
import net.pokeranalytics.android.ui.view.RowRepresentable 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.find
import net.pokeranalytics.android.util.extensions.sorted 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 { companion object {
const val REQUEST_CODE_DETAILS = 1000 const val REQUEST_CODE_DETAILS = 1000
} }
private lateinit var identifiableClass: Class<out Deletable> private var menu: Menu? = null
private lateinit var dataType: LiveData
private lateinit var items: RealmResults<out Deletable>
private var dataListMenu: Menu? = null
private var searchView: SearchView? = 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<out Deletable> { open fun retrieveItems(realm: Realm): RealmResults<out Deletable> {
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<Deletable> { override fun deletableItems() : List<Deletable> {
return this.items return this.model.items
} }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initData()
initUI() 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 * Init UI
*/ */
private fun initUI() { 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) setDisplayHomeAsUpEnabled(true)
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())
this.dataListAdapter = RowRepresentableAdapter(this, this) this.dataListAdapter = RowRepresentableAdapter(this.model, this)
val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position -> val swipeToDelete = SwipeToDeleteCallback(this.dataListAdapter) { position ->
val item = this.items[position] val item = this.model.items[position]
if (item != null) { if (item != null) {
val itemId = item.id val itemId = item.id
deleteItem(dataListAdapter, items, itemId) deleteItem(this.dataListAdapter, this.model.items, itemId)
} else { } else {
throw PAIllegalStateException("Item with position $position not found") throw PAIllegalStateException("Item with position $position not found")
} }
@ -123,10 +115,13 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS
this.addButton.setOnClickListener { this.addButton.setOnClickListener {
EditableDataActivity.newInstance( EditableDataActivity.newInstance(
requireContext(), requireContext(),
dataType = this.dataType.ordinal, dataType = this.model.dataType.ordinal,
primaryKey = null primaryKey = null
) )
} }
this.addButton.isVisible = this.model.showAddButton
} }
override fun onResume() { override fun onResume() {
@ -138,14 +133,14 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS
menu.clear() menu.clear()
inflater.inflate(R.menu.toolbar_data_list, menu) inflater.inflate(R.menu.toolbar_data_list, menu)
this.dataListMenu = menu this.menu = menu
val searchMenuItem = menu.findItem(R.id.action_search) val searchMenuItem = menu.findItem(R.id.action_search)
searchMenuItem.isVisible = isSearchable searchMenuItem.isVisible = this.model.isSearchable
searchView = searchMenuItem.actionView as SearchView? this.searchView = searchMenuItem.actionView as SearchView?
searchView?.removeMargins() this.searchView?.removeMargins()
searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { this.searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean { override fun onQueryTextSubmit(query: String?): Boolean {
return false return false
} }
@ -159,22 +154,9 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS
super.onCreateOptionsMenu(menu, inflater) 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) { 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 identifier = (row as Identifiable).id
val intent = Intent() val intent = Intent()
intent.putExtra(BundleKey.PRIMARY_KEY.value, identifier) intent.putExtra(BundleKey.PRIMARY_KEY.value, identifier)
@ -182,7 +164,7 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS
this.activity?.finish() this.activity?.finish()
} else { } else {
when (this.dataType) { when (this.model.dataType) {
LiveData.FILTER -> { LiveData.FILTER -> {
val intent = Intent() val intent = Intent()
intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id)
@ -191,25 +173,19 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS
} }
else -> { else -> {
val identifier = (row as Identifiable).id 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 * Filter the items list with the given search content
*/ */
private fun filterItemsWithSearch(searchContent: String?) { 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() this.dataListAdapter.notifyDataSetChanged()
} }

@ -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<out Deletable>
/***
* The item ids to load
*/
var itemIds: Array<String>? = null
val isSearchable: Boolean
get() { return this.dataType.isSearchable }
val identifiableClass: Class<out Deletable>
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<out Deletable>) {
this.items = items
}
}

@ -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()
}
}

@ -45,11 +45,13 @@ class HandHistoryActivity : BaseActivity() {
*/ */
private fun initUI() { private fun initUI() {
val fragmentTransaction = supportFragmentManager.beginTransaction()
val handHistoryId = intent.getStringExtra(IntentKey.IDENTIFIER.keyName) val handHistoryId = intent.getStringExtra(IntentKey.IDENTIFIER.keyName)
val sessionId = intent.getStringExtra(IntentKey.SESSION_CONFIGURATION.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.add(R.id.container, fragment)
fragmentTransaction.commit() fragmentTransaction.commit()

@ -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.Action
import net.pokeranalytics.android.model.realm.handhistory.Card import net.pokeranalytics.android.model.realm.handhistory.Card
import net.pokeranalytics.android.model.realm.handhistory.HandHistory 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.activity.components.RequestCode
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.extensions.px 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.RealmFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType 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.model.*
import net.pokeranalytics.android.ui.modules.handhistory.views.KeyboardListener import net.pokeranalytics.android.ui.modules.handhistory.views.KeyboardListener
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
@ -384,7 +384,7 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL
when (tag) { when (tag) {
PlayerSetupRow.Tag.PLAYER.ordinal -> { PlayerSetupRow.Tag.PLAYER.ordinal -> {
this.model.clickPosition = position this.model.clickPosition = position
DataListActivity.newSelectionDialogInstance(this, LiveData.PLAYER) DataListActivity.newDialogInstance(this, LiveData.PLAYER, true)
} }
else -> { else -> {
Timber.d("onItemClick not configured for row: $row, position: $position, tag: $tag") Timber.d("onItemClick not configured for row: $row, position: $position, tag: $tag")

@ -2,23 +2,39 @@ package net.pokeranalytics.android.ui.modules.handhistory.views
import android.view.View import android.view.View
import androidx.recyclerview.widget.RecyclerView 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.model.realm.handhistory.HandHistory
import net.pokeranalytics.android.ui.adapter.BindableHolder import net.pokeranalytics.android.ui.adapter.BindableHolder
import net.pokeranalytics.android.ui.adapter.RecyclerAdapter 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.ui.view.RowRepresentable
import net.pokeranalytics.android.util.extensions.formatted
class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
BindableHolder { BindableHolder {
override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) {
this.bind(position, row, adapter.delegate)
}
itemView.handHistoryRow.setData(row as HandHistory) fun bind(position: Int, row: RowRepresentable, delegate: RowRepresentableDelegate?) {
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row) 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)
} }
} }

@ -37,7 +37,8 @@ enum class SessionRow : RowRepresentable {
END_DATE, END_DATE,
BREAK_TIME, BREAK_TIME,
COMMENT; COMMENT,
HANDS;
companion object { companion object {
/** /**
@ -62,14 +63,20 @@ enum class SessionRow : RowRepresentable {
) )
} }
SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> {
arrayListOf( val fields = mutableListOf<RowRepresentable>()
fields.addAll(listOf(
PRIZE, PRIZE,
BUY_IN, BUY_IN,
POSITION, POSITION,
PLAYERS, PLAYERS,
TIPS, TIPS))
COMMENT, fields.add(SeparatorRow())
SeparatorRow(), fields.add(COMMENT)
if (session.handHistories?.isNotEmpty() == true) {
fields.add(HANDS)
}
fields.add(SeparatorRow())
fields.addAll(listOf(
GAME, GAME,
INITIAL_BUY_IN, INITIAL_BUY_IN,
LOCATION, LOCATION,
@ -82,7 +89,8 @@ enum class SessionRow : RowRepresentable {
START_DATE, START_DATE,
END_DATE, END_DATE,
BREAK_TIME BREAK_TIME
) ))
fields
} }
} }
} }
@ -100,7 +108,11 @@ enum class SessionRow : RowRepresentable {
session.isLive -> fields.addAll(listOf(CASHED_OUT, BUY_IN, TIPS)) session.isLive -> fields.addAll(listOf(CASHED_OUT, BUY_IN, TIPS))
else -> fields.add(NET_RESULT) else -> fields.add(NET_RESULT)
} }
fields.add(SeparatorRow())
fields.add(COMMENT) fields.add(COMMENT)
if (session.handHistories?.isNotEmpty() == true) {
fields.add(HANDS)
}
fields.add(SeparatorRow()) fields.add(SeparatorRow())
fields.addAll(listOf( fields.addAll(listOf(
GAME, GAME,
@ -108,10 +120,10 @@ enum class SessionRow : RowRepresentable {
LOCATION, LOCATION,
BANKROLL, BANKROLL,
TABLE_SIZE, TABLE_SIZE,
SeparatorRow(),
START_DATE, START_DATE,
END_DATE, END_DATE,
BREAK_TIME BREAK_TIME
) )
) )
return fields return fields
@ -146,6 +158,7 @@ enum class SessionRow : RowRepresentable {
END_DATE -> R.string.end_date END_DATE -> R.string.end_date
BREAK_TIME -> R.string.break_time BREAK_TIME -> R.string.break_time
COMMENT -> R.string.comment COMMENT -> R.string.comment
HANDS -> R.string.hands
} }
} }
@ -154,7 +167,8 @@ enum class SessionRow : RowRepresentable {
return when (this) { return when (this) {
NET_RESULT, PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS, NET_RESULT, PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS,
GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, 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
} }
} }

@ -8,7 +8,7 @@
<!-- <fragment--> <!-- <fragment-->
<!-- android:id="@+id/dataListFragment"--> <!-- android:id="@+id/dataListFragment"-->
<!-- android:name="net.pokeranalytics.android.ui.fragment.DataListFragment"--> <!-- android:name="net.pokeranalytics.android.ui.modules.datalist.DataListFragment"-->
<!-- android:layout_width="match_parent"--> <!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"--> <!-- android:layout_height="match_parent"-->
<!-- tools:layout="@layout/fragment_data_list" />--> <!-- tools:layout="@layout/fragment_data_list" />-->

@ -4,10 +4,10 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<fragment <!-- <fragment-->
android:id="@+id/dataListFragment" <!-- android:id="@+id/dataListFragment"-->
android:name="net.pokeranalytics.android.ui.fragment.DataListFragment" <!-- android:name="net.pokeranalytics.android.ui.modules.datalist.DataListFragment"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="match_parent" /> <!-- android:layout_height="match_parent" />-->
</FrameLayout> </FrameLayout>

@ -5,9 +5,9 @@
android:orientation="vertical" android:orientation="vertical"
android:padding="4dp"> android:padding="4dp">
<net.pokeranalytics.android.ui.view.HandHistoryRowView <!-- <net.pokeranalytics.android.ui.view.HandHistoryRowView-->
android:id="@+id/handHistoryRow" <!-- android:id="@+id/handHistoryRow"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" /> <!-- android:layout_height="wrap_content" />-->
</LinearLayout> </LinearLayout>

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/constraintLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="56dp" android:layout_height="56dp"
android:background="?selectableItemBackground"> android:background="?selectableItemBackground">

Loading…
Cancel
Save