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 ca569a7e..ae1cf2ad 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 @@ -23,7 +23,8 @@ import net.pokeranalytics.android.util.toCurrency import java.util.* import kotlin.collections.ArrayList -open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource, RowEditable { +open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource, + RowEditable, RowRepresentable { @PrimaryKey var id = UUID.randomUUID().toString() @@ -248,10 +249,12 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource return 0.0 } + override fun getDisplayName(): String { + return "session ${this.creationDate}" + } override fun adapterRows(): ArrayList { val rows = ArrayList() - rows.clear() rows.addAll(SessionRow.getRowsForState(getState())) return rows } @@ -263,8 +266,7 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource override fun stringForRow(row: RowRepresentable): String { return when (row) { SessionRow.BUY_IN -> buyin.toCurrency() - SessionRow.CASHED_OUT -> result?.cashout?.toCurrency() ?: "--" - SessionRow.BLINDS -> getBlinds() + SessionRow.BLINDS -> if (cgSmallBlind != null && cgBigBlind != null) "$cgSmallBlind / $cgBigBlind" else "--" SessionRow.GAME -> game?.name ?: "--" SessionRow.LOCATION -> location?.name ?: "--" SessionRow.BANKROLL -> bankroll?.name ?: "--" diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt index b8203b78..b1c395b9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt @@ -3,6 +3,7 @@ package net.pokeranalytics.android.ui.activity import android.content.Context import android.content.Intent import android.os.Bundle +import androidx.fragment.app.Fragment import com.google.android.material.bottomnavigation.BottomNavigationView import kotlinx.android.synthetic.main.activity_home.* import net.pokeranalytics.android.R @@ -68,7 +69,7 @@ class HomeActivity : PokerAnalyticsActivity() { else -> "" } - val fragment = when(index) { + val fragment: Fragment = when(index) { 0 -> HistoryFragment() 1 -> StatsFragment() else -> SettingsFragment() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index 517aeca3..e43a9487 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -9,13 +9,19 @@ import androidx.recyclerview.widget.LinearLayoutManager import io.realm.RealmResults import kotlinx.android.synthetic.main.fragment_history.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.ObjectSavable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.activity.SessionActivity import net.pokeranalytics.android.ui.adapter.HistoryAdapter +import net.pokeranalytics.android.ui.adapter.components.RowRepresentableAdapter +import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDataSource +import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.data.sessionDao -class HistoryFragment : PokerAnalyticsFragment() { +class HistoryFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, RowRepresentableDelegate { companion object { fun newInstance(): HistoryFragment { @@ -26,8 +32,8 @@ class HistoryFragment : PokerAnalyticsFragment() { } } - private lateinit var historyAdapter: HistoryAdapter - private var realmSessions: RealmResults? = null + private lateinit var historyAdapter: RowRepresentableAdapter + private lateinit var realmSessions: RealmResults override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_history, container, false) @@ -41,7 +47,7 @@ class HistoryFragment : PokerAnalyticsFragment() { override fun onDestroyView() { super.onDestroyView() - realmSessions?.removeAllChangeListeners() + realmSessions.removeAllChangeListeners() } /** @@ -70,28 +76,34 @@ class HistoryFragment : PokerAnalyticsFragment() { * Init data */ private fun initData() { - realmSessions = getRealm().sessionDao().findAllSessions() - realmSessions?.let { + val viewManager = LinearLayoutManager(requireContext()) + historyAdapter = RowRepresentableAdapter(this, this) - val viewManager = LinearLayoutManager(requireContext()) - historyAdapter = HistoryAdapter(it) + recyclerView.apply { + setHasFixedSize(true) + layoutManager = viewManager + adapter = historyAdapter + } + } - recyclerView.apply { - setHasFixedSize(true) - layoutManager = viewManager - adapter = historyAdapter - } + override fun rowRepresentableForPosition(position: Int): RowRepresentable { + return this.realmSessions[position] as RowRepresentable + } - historyAdapter.onClickOnSession = {position, session -> - SessionActivity.newInstance(requireContext(), sessionId = session.id) - } + override fun numberOfRows(): Int { + return this.realmSessions.size + } - it.addChangeListener { newSessions -> - historyAdapter.notifyDataSetChanged() - } - } + override fun viewTypeForPosition(position: Int): Int { + return RowViewType.ROW_SESSION.ordinal + } + override fun indexForRow(row: RowRepresentable): Int { + return this.realmSessions.indexOf(row) } + override fun onRowSelected(row: RowRepresentable) { + SessionActivity.newInstance(requireContext(), sessionId = (row as ObjectSavable).uniqueIdentifier()) + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt index 868d17e7..38159ee5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt @@ -1,16 +1,131 @@ package net.pokeranalytics.android.ui.fragment.components.bottomsheet +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import androidx.recyclerview.widget.GridLayoutManager import kotlinx.android.synthetic.main.bottom_sheet_grid.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* -import net.pokeranalytics.android.ui.adapter.TableSizeGridAdapter +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.view.GridSpacingItemDecoration +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.px +class TableSize(var numberOfPlayer:Int): RowRepresentable { + companion object { + val all = Array(8, init = + { index -> TableSize(index+2)}) + } + + override val resId: Int? + get() { + return if (this.numberOfPlayer == 2) { + R.string.heads_up + } else { + R.string.max + } + } + + override fun localizedTitle(context: Context): String { + this.resId?.let { + return if (this.numberOfPlayer == 2) { + context.getString(it) + } else { + "$this.numberOfPlayer$context.getString(it)" + } + } + return super.localizedTitle(context) + } + + override val viewType: Int + get() = RowViewType.TITLE_GRID.ordinal +} + +class BottomSheetTableSizeGridFragment : BottomSheetFragment(), RowRepresentableDataSource, RowRepresentableDelegate { + + private lateinit var dataAdapter: RowRepresentableAdapter + private var defaultSize: Int? = null + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + initUI() + } + + override fun onResume() { + super.onResume() + dataAdapter.notifyDataSetChanged() + } + + override fun getValue(): Any? { + return defaultSize + } + + /** + * Init data + */ + private fun initData() { + + val bottomSheetData = getData() + if (bottomSheetData.isNotEmpty() && bottomSheetData.first().defaultValue != null) { + defaultSize = bottomSheetData.first().defaultValue as Int? + } + } + /** + * Init UI + */ + private fun initUI() { + + setAddButtonVisible(false) + + LayoutInflater.from(requireContext()) + .inflate(net.pokeranalytics.android.R.layout.bottom_sheet_grid, view?.bottomSheetContainer, true) + + val viewManager = GridLayoutManager(requireContext(), 3) + dataAdapter = RowRepresentableAdapter(this, this) + + val spanCount = 3 + val spacing = 2.px + val includeEdge = false + + reyclerView.apply { + setHasFixedSize(true) + layoutManager = viewManager + adapter = dataAdapter + addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, includeEdge)) + } + } + + override fun rowRepresentableForPosition(position: Int): RowRepresentable { + return TableSize.all[position] + } + + override fun indexForRow(row: RowRepresentable): Int { + return TableSize.all.indexOf(row) + } + + override fun numberOfRows(): Int { + return TableSize.all.size + } + + override fun onRowSelected(row: RowRepresentable) { + bottomSheetDelegate.setValue((this.row as TableSize).numberOfPlayer, this.row) + dismiss() + } + + override fun stringForRow(row: RowRepresentable): String { + this.context?.let { + return row.localizedTitle(it) + } + return "UNKNOWN CONTEXT FOR ROW $row" + } +} + +/* class BottomSheetTableSizeGridFragment : BottomSheetFragment() { private var dataList: ArrayList = ArrayList() @@ -79,4 +194,6 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment() { } -} \ No newline at end of file +} + + */ \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 3dab41d9..a0845f5d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -6,11 +6,15 @@ import android.view.ViewGroup import androidx.appcompat.widget.AppCompatTextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.row_bottom_sheet_grid_title.view.* import kotlinx.android.synthetic.main.row_header_title_value.view.* +import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_title.view.* import kotlinx.android.synthetic.main.row_title_value.view.* import kotlinx.android.synthetic.main.row_title_value_action.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.adapter.TableSizeGridAdapter import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDataSource /** @@ -30,7 +34,9 @@ enum class RowViewType { TITLE_VALUE, TITLE_VALUE_ACTION, DATA, - BOTTOM_SHEET_DATA; + BOTTOM_SHEET_DATA, + TITLE_GRID, + ROW_SESSION; inner class FakeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { @@ -38,6 +44,21 @@ enum class RowViewType { } } + inner class RowSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), + BindableHolder { + override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + itemView.sessionRow.setData(row as Session) + itemView.sessionRow.setOnClickListener(listener) + } + } + + inner class CellSessionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + itemView.title.text = row.localizedTitle(itemView.context) + itemView.container.setOnClickListener(listener) + } + } + inner class DataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { override fun bind(row: RowRepresentable, rowRepresentableDataSource: RowRepresentableDataSource?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { itemView.findViewById(R.id.rowTitle_title).text = row.getDisplayName() @@ -147,6 +168,18 @@ enum class RowViewType { false ) ) + TITLE_GRID -> CellSessionViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_bottom_sheet_grid_title, + parent, + false) + ) + ROW_SESSION -> RowSessionViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_history_session, + parent, + false) + ) else -> FakeViewHolder(parent) } }