merge conflicts fix

dev_raz_wip
Razmig Sarkissian 7 years ago
commit 6aaae52450
  1. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt
  2. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt
  3. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt
  4. 32
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  5. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt
  6. 2
      app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt
  7. 71
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicListAdapter.kt
  8. 8
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicRowInterface.kt
  9. 113
      app/src/main/java/net/pokeranalytics/android/ui/adapter/components/RowViewType.kt
  10. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt
  11. 30
      app/src/main/java/net/pokeranalytics/android/ui/fragment/NewSessionFragment.kt
  12. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetData.kt
  13. 119
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDateFragment.kt
  14. 25
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDoubleEditTextFragment.kt
  15. 14
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetEditTextFragment.kt
  16. 10
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetFragment.kt
  17. 77
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimeDialogFragment.kt
  18. 21
      app/src/main/java/net/pokeranalytics/android/util/Extensions.kt
  19. 1
      app/src/main/res/layout/row_title_value.xml
  20. 58
      app/src/main/res/layout/row_title_value_action.xml
  21. 4
      app/src/main/res/values/strings.xml

@ -63,7 +63,7 @@ open class Bankroll(name: String = "") : RealmObject(), DynamicRowDelegate, Disp
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add(BottomSheetData(this.name, "Name", InputType.TYPE_CLASS_TEXT)) SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
} }
return data return data
} }

@ -39,7 +39,7 @@ open class Game : RealmObject(), DynamicRowDelegate, DisplayableDataSource, Edit
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add(BottomSheetData(this.name, "Name", InputType.TYPE_CLASS_TEXT)) SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
} }
return data return data
} }

@ -43,7 +43,7 @@ open class Location : RealmObject(), DynamicRowDelegate, DisplayableDataSource,
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add(BottomSheetData(this.name, "Name", InputType.TYPE_CLASS_TEXT)) SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
} }
return data return data
} }

@ -4,11 +4,13 @@ import android.text.InputType
import io.realm.* import io.realm.*
import io.realm.annotations.Ignore import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.SessionInterface import net.pokeranalytics.android.calculus.SessionInterface
import net.pokeranalytics.android.model.DataList import net.pokeranalytics.android.model.DataList
import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.adapter.components.*
import net.pokeranalytics.android.ui.fragment.components.BottomSheetData import net.pokeranalytics.android.ui.fragment.components.BottomSheetData
import net.pokeranalytics.android.util.data.sessionDao import net.pokeranalytics.android.util.data.sessionDao
import net.pokeranalytics.android.util.short
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@ -142,12 +144,23 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
SessionRow.GAME -> game?.title ?: "--" SessionRow.GAME -> game?.title ?: "--"
SessionRow.LOCATION -> location?.title ?: "--" SessionRow.LOCATION -> location?.title ?: "--"
SessionRow.BANKROLL -> bankroll?.title ?: "--" SessionRow.BANKROLL -> bankroll?.title ?: "--"
SessionRow.DATE -> if (timeFrame != null) timeFrame?.startDate.toString() else "--" SessionRow.START_DATE -> if (timeFrame != null) timeFrame?.startDate?.short() ?: "--" else "--"
SessionRow.END_DATE -> if (timeFrame != null) timeFrame?.endDate?.short() ?: "--" else "--"
SessionRow.COMMENT -> if (comment.isNotEmpty()) comment else "--" SessionRow.COMMENT -> if (comment.isNotEmpty()) comment else "--"
else -> "--" else -> "--"
} }
} }
override fun actionIconForRow(row: DynamicRowInterface): Int? {
return when (row) {
SessionRow.START_DATE, SessionRow.END_DATE -> {
R.drawable.ic_close_white_24dp
}
else -> null
}
}
override var title: String = "Change that: $creationDate" override var title: String = "Change that: $creationDate"
override val primaryKey: String get() = this.id override val primaryKey: String get() = this.id
@ -155,27 +168,22 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa
val data = ArrayList<BottomSheetData>() val data = ArrayList<BottomSheetData>()
// Todo: Localize & set real data
when (row) { when (row) {
SessionRow.GAME -> { SessionRow.GAME -> {
data.add(BottomSheetData(game, "", 0, DataList.GAME.items(realm))) data.add(BottomSheetData(game, inputType = InputType.TYPE_NULL, data = DataList.GAME.items(realm)))
} }
SessionRow.LOCATION -> { SessionRow.LOCATION -> {
data.add(BottomSheetData(location, "", 0, DataList.LOCATION.items(realm))) data.add(BottomSheetData(location, inputType = InputType.TYPE_NULL, data = DataList.LOCATION.items(realm)))
} }
SessionRow.BANKROLL -> { SessionRow.BANKROLL -> {
data.add(BottomSheetData(bankroll, "", 0, DataList.BANKROLL.items(realm))) data.add(BottomSheetData(bankroll, inputType = InputType.TYPE_NULL, data = DataList.BANKROLL.items(realm)))
}
SessionRow.DATE -> {
data.add(BottomSheetData(timeFrame?.startDate, "Start date"))
data.add(BottomSheetData(timeFrame?.endDate, "End date"))
} }
SessionRow.BLINDS -> { SessionRow.BLINDS -> {
data.add(BottomSheetData(cgSmallBlind, "Small blind", InputType.TYPE_CLASS_NUMBER)) data.add(BottomSheetData(cgSmallBlind, R.string.small_blind, InputType.TYPE_CLASS_NUMBER))
data.add(BottomSheetData(cgBigBlind, "Big blind", InputType.TYPE_CLASS_NUMBER)) data.add(BottomSheetData(cgBigBlind, R.string.big_blind, InputType.TYPE_CLASS_NUMBER))
} }
SessionRow.COMMENT -> { SessionRow.COMMENT -> {
data.add(BottomSheetData(comment, "Comment", InputType.TYPE_CLASS_TEXT)) data.add(BottomSheetData(comment, R.string.comment, InputType.TYPE_CLASS_TEXT))
} }
} }

@ -37,7 +37,7 @@ open class TournamentFeature : RealmObject(), DynamicRowDelegate, DisplayableDat
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add(BottomSheetData(this.name, "Name", InputType.TYPE_CLASS_TEXT)) SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
} }
return data return data
} }

@ -46,7 +46,7 @@ open class TransactionType : RealmObject(), DynamicRowDelegate, DisplayableDataS
override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> { override fun getBottomSheetData(row: DynamicRowInterface): ArrayList<BottomSheetData> {
val data = java.util.ArrayList<BottomSheetData>() val data = java.util.ArrayList<BottomSheetData>()
when (row) { when (row) {
SimpleRow.NAME -> data.add(BottomSheetData(this.name, "Name", InputType.TYPE_CLASS_TEXT)) SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT))
} }
return data return data
} }

@ -5,15 +5,24 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
interface EditableDataDelegate { interface EditableDataDelegate {
fun setValue(value: Any, row: DynamicRowInterface) fun setValue(value: Any, row: DynamicRowInterface)
} }
interface DynamicRowDelegate { interface DynamicRowDelegate {
fun adapterRows() : ArrayList<DynamicRowInterface> fun adapterRows(): ArrayList<DynamicRowInterface>
fun boolForRow(row: DynamicRowInterface) : Boolean { return false } fun boolForRow(row: DynamicRowInterface): Boolean {
fun stringForRow(row: DynamicRowInterface) : String { return "" } return false
}
fun stringForRow(row: DynamicRowInterface): String {
return ""
}
fun actionIconForRow(row: DynamicRowInterface): Int? {
return 0
}
/** /**
* Manages: * Manages:
@ -27,36 +36,44 @@ interface DynamicRowDelegate {
} }
interface DynamicRowCallback { interface DynamicRowCallback {
fun onRowSelected(row: DynamicRowInterface) fun onRowSelected(row: DynamicRowInterface) {}
fun onActionSelected(row: DynamicRowInterface) {}
} }
class DynamicListAdapter(var delegate: DynamicRowDelegate, var callBackDelegate: DynamicRowCallback? = null) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { class DynamicListAdapter(var delegate: DynamicRowDelegate, var callBackDelegate: DynamicRowCallback? = null) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var rows: ArrayList<DynamicRowInterface> = ArrayList()
init {
this.rows = delegate.adapterRows()
}
override fun getItemViewType(position: Int): Int {
return this.rows[position].viewType
}
private var rows: ArrayList<DynamicRowInterface> = ArrayList() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val rowViewType: RowViewType = RowViewType.values()[viewType]
return rowViewType.viewHolder(parent)
}
init { override fun getItemCount(): Int {
this.rows = delegate.adapterRows() return this.rows.size
} }
override fun getItemViewType(position: Int): Int { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
return this.rows[position].viewType val dynamicRow = this.rows[position]
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val listener = View.OnClickListener {
val rowViewType: RowViewType = RowViewType.values()[viewType] callBackDelegate?.onRowSelected(dynamicRow)
return rowViewType.viewHolder(parent) }
}
override fun getItemCount(): Int { val actionListener = View.OnClickListener {
return this.rows.size callBackDelegate?.onActionSelected(dynamicRow)
} }
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { (holder as DynamicHolder).bind(dynamicRow, this.delegate, listener, actionListener)
val dynamicRow = this.rows[position] }
val listener = View.OnClickListener {
callBackDelegate?.onRowSelected(dynamicRow)
}
(holder as DynamicHolder).bind(dynamicRow, this.delegate, listener)
}
} }

@ -38,7 +38,8 @@ enum class SessionRow(val resId: Int) : DynamicRowInterface {
BLINDS(R.string.blinds), BLINDS(R.string.blinds),
LOCATION(R.string.location), LOCATION(R.string.location),
BANKROLL(R.string.bankroll), BANKROLL(R.string.bankroll),
DATE(R.string.date), START_DATE(R.string.start_date),
END_DATE(R.string.end_date),
COMMENT(R.string.comment); COMMENT(R.string.comment);
override fun localizedTitle(context: Context): String { override fun localizedTitle(context: Context): String {
@ -48,7 +49,8 @@ enum class SessionRow(val resId: Int) : DynamicRowInterface {
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
BLINDS, GAME, DATE, BANKROLL, LOCATION, COMMENT -> RowViewType.TITLE_VALUE.ordinal BLINDS, GAME, BANKROLL, LOCATION, COMMENT -> RowViewType.TITLE_VALUE.ordinal
START_DATE, END_DATE -> RowViewType.TITLE_VALUE_ACTION.ordinal
} }
} }
@ -59,8 +61,8 @@ enum class SessionRow(val resId: Int) : DynamicRowInterface {
GAME -> BottomSheetType.LIST GAME -> BottomSheetType.LIST
LOCATION -> BottomSheetType.LIST LOCATION -> BottomSheetType.LIST
BANKROLL -> BottomSheetType.LIST BANKROLL -> BottomSheetType.LIST
DATE -> BottomSheetType.DATE
COMMENT -> BottomSheetType.EDIT_TEXT COMMENT -> BottomSheetType.EDIT_TEXT
else -> BottomSheetType.NONE
} }
} }

@ -4,64 +4,89 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.row_session.view.* import kotlinx.android.synthetic.main.row_title_value_action.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
interface DynamicHolder { interface DynamicHolder {
fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate? = null, listener: View.OnClickListener) fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate? = null, listener: View.OnClickListener, actionListener: View.OnClickListener? = null) {}
} }
enum class RowViewType { enum class RowViewType {
HEADER, HEADER,
EDIT_TEXT, EDIT_TEXT,
TITLE, TITLE,
TITLE_VALUE; TITLE_VALUE,
TITLE_VALUE_ACTION;
inner class FakeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { inner class FakeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder {
override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener) { override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener, actionListener: View.OnClickListener?) {
} }
} }
inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder {
override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener) { override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener, actionListener: View.OnClickListener?) {
itemView.title.text = row.localizedTitle(itemView.context) itemView.title.text = row.localizedTitle(itemView.context)
itemView.container.setOnClickListener(listener)
}
}
delegate?.let { inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder {
itemView.value.text = it.stringForRow(row) override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener, actionListener: View.OnClickListener?) {
} itemView.title.text = row.localizedTitle(itemView.context)
itemView.container.setOnClickListener(listener)
}
}
inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { delegate?.let {
override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener) { itemView.value.text = it.stringForRow(row)
itemView.title.text = row.localizedTitle(itemView.context) }
itemView.container.setOnClickListener(listener) itemView.container.setOnClickListener(listener)
} }
} }
inner class TitleValueActionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder {
override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener, actionListener: View.OnClickListener?) {
itemView.title.text = row.localizedTitle(itemView.context)
delegate?.let { rowDelegate ->
fun viewHolder(parent: ViewGroup): RecyclerView.ViewHolder { val value = rowDelegate.stringForRow(row)
return when (this) { itemView.value.text = value
TITLE_VALUE -> TitleValueViewHolder( itemView.action.visibility = if (value == "--") View.GONE else View.VISIBLE
LayoutInflater.from(parent.context).inflate( rowDelegate.actionIconForRow(row)?.let {icon ->
R.layout.row_title_value, itemView.action.setImageResource(icon)
parent, }
false }
) itemView.container.setOnClickListener(listener)
) itemView.action.setOnClickListener(actionListener)
TITLE -> TitleViewHolder( }
LayoutInflater.from(parent.context).inflate( }
R.layout.row_title,
parent,
false
)
)
else -> FakeViewHolder(parent)
} fun viewHolder(parent: ViewGroup): RecyclerView.ViewHolder {
} return when (this) {
TITLE -> TitleViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title,
parent,
false
)
)
TITLE_VALUE -> TitleValueViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title_value,
parent,
false
)
)
TITLE_VALUE_ACTION -> TitleValueActionViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.row_title_value_action,
parent,
false
)
)
else -> FakeViewHolder(parent)
}
}
} }

@ -49,10 +49,6 @@ class EditableDataFragment : PokerAnalyticsFragment(), DynamicRowCallback, Botto
Toast.makeText(requireContext(), "Clear: $row", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "Clear: $row", Toast.LENGTH_SHORT).show()
} }
override fun clickOnDone(row: DynamicRowInterface) {
Toast.makeText(requireContext(), "Done: $row", Toast.LENGTH_SHORT).show()
}
override fun setValue(value: Any, row: DynamicRowInterface) { override fun setValue(value: Any, row: DynamicRowInterface) {
(this.item as EditableDataSource).setBottomSheetValue(value, row) (this.item as EditableDataSource).setBottomSheetValue(value, row)
this.getRealm().executeTransaction { this.getRealm().executeTransaction {

@ -8,8 +8,8 @@ import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_new_session.* import kotlinx.android.synthetic.main.fragment_new_session.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.model.DataList import net.pokeranalytics.android.model.DataList
import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.components.DynamicListAdapter import net.pokeranalytics.android.ui.adapter.components.DynamicListAdapter
@ -18,7 +18,9 @@ import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface
import net.pokeranalytics.android.ui.adapter.components.SessionRow import net.pokeranalytics.android.ui.adapter.components.SessionRow
import net.pokeranalytics.android.ui.fragment.components.BottomSheetDelegate import net.pokeranalytics.android.ui.fragment.components.BottomSheetDelegate
import net.pokeranalytics.android.ui.fragment.components.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.BottomSheetFragment
import net.pokeranalytics.android.ui.fragment.components.DateTimePickerManager
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import java.util.*
class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, BottomSheetDelegate { class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, BottomSheetDelegate {
@ -37,7 +39,15 @@ class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, BottomS
override fun onRowSelected(row: DynamicRowInterface) { override fun onRowSelected(row: DynamicRowInterface) {
val data = currentSession.getBottomSheetData(row) val data = currentSession.getBottomSheetData(row)
BottomSheetFragment.create(fragmentManager, row, this, data) when(row) {
SessionRow.START_DATE -> DateTimePickerManager.create(requireContext(), row, this, currentSession.timeFrame?.startDate)
SessionRow.END_DATE -> DateTimePickerManager.create(requireContext(), row, this, currentSession.timeFrame?.endDate)
else -> BottomSheetFragment.create(fragmentManager, row, this, data)
}
}
override fun onActionSelected(row: DynamicRowInterface) {
Toast.makeText(requireContext(), "Action for row: $row", Toast.LENGTH_SHORT).show()
} }
override fun clickOnAdd(row: DynamicRowInterface) { override fun clickOnAdd(row: DynamicRowInterface) {
@ -62,20 +72,26 @@ class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, BottomS
sessionAdapter.notifyItemChanged(SessionRow.values().indexOf(row)) sessionAdapter.notifyItemChanged(SessionRow.values().indexOf(row))
} }
override fun clickOnDone(row: DynamicRowInterface) {
Toast.makeText(requireContext(), "clickOnDone: $row", Toast.LENGTH_SHORT).show()
}
override fun setValue(value: Any, row: DynamicRowInterface) { override fun setValue(value: Any, row: DynamicRowInterface) {
when(row) { when(row) {
SessionRow.GAME -> if (value is Game) currentSession.game = value SessionRow.GAME -> if (value is Game) currentSession.game = value
SessionRow.BANKROLL -> if (value is Bankroll) currentSession.bankroll = value SessionRow.BANKROLL -> if (value is Bankroll) currentSession.bankroll = value
SessionRow.LOCATION -> if (value is Location) currentSession.location = value SessionRow.LOCATION -> if (value is Location) currentSession.location = value
SessionRow.COMMENT -> if (value is String) currentSession.comment = value
SessionRow.BLINDS -> if (value is ArrayList<*>) { SessionRow.BLINDS -> if (value is ArrayList<*>) {
currentSession.cgSmallBlind = (value[0] as String? ?: "0").toDouble() currentSession.cgSmallBlind = (value[0] as String? ?: "0").toDouble()
currentSession.cgBigBlind = (value[1] as String? ?: "0").toDouble() currentSession.cgBigBlind = (value[1] as String? ?: "0").toDouble()
} }
SessionRow.COMMENT -> if (value is String) currentSession.comment = value SessionRow.START_DATE -> if (value is Date) {
val timeFrame = currentSession.timeFrame ?: TimeFrame()
timeFrame.setDate(value, null)
currentSession.timeFrame = timeFrame
}
SessionRow.END_DATE -> if (value is Date) {
val timeFrame = currentSession.timeFrame ?: TimeFrame()
timeFrame.setDate(timeFrame.startDate, value)
currentSession.timeFrame = timeFrame
}
} }
sessionAdapter.notifyItemChanged(SessionRow.values().indexOf(row)) sessionAdapter.notifyItemChanged(SessionRow.values().indexOf(row))
} }

@ -5,7 +5,7 @@ import io.realm.RealmResults
class BottomSheetData( class BottomSheetData(
var defaultValue: Any? = null, var defaultValue: Any? = null,
var hint: String? = "", var hint: Int? = null,
var inputType: Int? = InputType.TYPE_CLASS_TEXT, var inputType: Int? = InputType.TYPE_CLASS_TEXT,
var data: RealmResults<*>? = null var data: RealmResults<*>? = null
) )

@ -1,119 +0,0 @@
package net.pokeranalytics.android.ui.fragment.components
import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.os.Bundle
import android.text.format.DateFormat
import android.view.LayoutInflater
import android.view.View
import android.widget.DatePicker
import android.widget.TimePicker
import kotlinx.android.synthetic.main.bottom_sheet_date.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import timber.log.Timber
import java.util.*
class BottomSheetDateFragment : BottomSheetFragment(), DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener {
enum class DateEdition {
START,
END
}
private val calendar = Calendar.getInstance()
private val calendarStart = Calendar.getInstance()
private val calendarEnd = Calendar.getInstance()
private var currentDateEdition = DateEdition.START
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initData()
initUI()
}
override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
when(currentDateEdition) {
DateEdition.START -> {
calendarStart.set(Calendar.YEAR, year)
calendarStart.set(Calendar.MONTH, month)
calendarStart.set(Calendar.DAY_OF_MONTH, dayOfMonth)
}
DateEdition.END -> {
calendarEnd.set(Calendar.YEAR, year)
calendarEnd.set(Calendar.MONTH, month)
calendarEnd.set(Calendar.DAY_OF_MONTH, dayOfMonth)
}
}
showTimePicker()
}
override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
when(currentDateEdition) {
DateEdition.START -> {
calendarStart.set(Calendar.HOUR_OF_DAY, hourOfDay)
calendarStart.set(Calendar.MINUTE, minute)
}
DateEdition.END -> {
calendarEnd.set(Calendar.HOUR_OF_DAY, hourOfDay)
calendarEnd.set(Calendar.MINUTE, minute)
}
}
Timber.d("Start date: ${calendarStart.time}")
Timber.d("End date: ${calendarEnd.time}")
}
/**
* Init data
*/
private fun initData() {
val data = getData()
}
/**
* Init UI
*/
private fun initUI() {
LayoutInflater.from(requireContext()).inflate(net.pokeranalytics.android.R.layout.bottom_sheet_date, view?.bottomSheetContainer, true)
setAddButtonVisible(false)
startDate.setOnClickListener {
currentDateEdition = DateEdition.START
showDatePicker()
}
endDate.setOnClickListener {
currentDateEdition = DateEdition.END
showDatePicker()
}
}
/**
* Show the date picker
*/
private fun showDatePicker() {
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)
val datePickerDialog = DatePickerDialog(requireContext(), this, year, month, day)
datePickerDialog.show()
}
/**
* Show the time picker
*/
private fun showTimePicker() {
val hour = calendar.get(Calendar.YEAR)
val minute = calendar.get(Calendar.MONTH)
val timePickerDialog = TimePickerDialog(activity, this, hour, minute, DateFormat.is24HourFormat(activity))
timePickerDialog.show()
}
}

@ -5,6 +5,7 @@ import android.text.InputType
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import androidx.core.widget.addTextChangedListener
import kotlinx.android.synthetic.main.bottom_sheet_double_edit_text.* import kotlinx.android.synthetic.main.bottom_sheet_double_edit_text.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
@ -12,6 +13,8 @@ import net.pokeranalytics.android.R
class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { class BottomSheetDoubleEditTextFragment : BottomSheetFragment() {
private val values = ArrayList<String>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initData() initData()
@ -23,6 +26,10 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() {
editText1.requestFocus() editText1.requestFocus()
} }
override fun getValue(): Any {
return values
}
/** /**
* Init data * Init data
*/ */
@ -36,24 +43,26 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() {
val data = getData() val data = getData()
values.add(0, "")
values.add(1, "")
LayoutInflater.from(requireContext()) LayoutInflater.from(requireContext())
.inflate(R.layout.bottom_sheet_double_edit_text, view?.bottomSheetContainer, true) .inflate(R.layout.bottom_sheet_double_edit_text, view?.bottomSheetContainer, true)
if (data.size == 2) { if (data.size == 2) {
editText1.hint = data[0].hint data[0].hint?.let { editText1.hint = getString(it) }
editText1.setText((data[0].defaultValue ?: "").toString())
editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT
editText1.addTextChangedListener { values[0] = it?.toString() ?: "" }
editText1.setText((data[0].defaultValue ?: "").toString())
editText2.hint = data[1].hint data[1].hint?.let { editText2.hint = getString(it) }
editText2.setText((data[1].defaultValue ?: "").toString())
editText2.inputType = data[1].inputType ?: InputType.TYPE_CLASS_TEXT editText2.inputType = data[1].inputType ?: InputType.TYPE_CLASS_TEXT
editText2.addTextChangedListener { values[1] = it?.toString() ?: "" }
editText2.setText((data[1].defaultValue ?: "").toString())
editText2.setOnEditorActionListener { v, actionId, event -> editText2.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_DONE) { if (actionId == EditorInfo.IME_ACTION_DONE) {
val values = ArrayList<String>()
values.add(editText1.text.toString())
values.add(editText2.text.toString())
bottomSheetDelegate.setValue(values, row) bottomSheetDelegate.setValue(values, row)
dismiss() dismiss()
true true
@ -61,10 +70,8 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() {
false false
} }
} }
} }
} }
} }

@ -5,6 +5,7 @@ import android.text.InputType
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import androidx.core.widget.addTextChangedListener
import kotlinx.android.synthetic.main.bottom_sheet_edit_text.* import kotlinx.android.synthetic.main.bottom_sheet_edit_text.*
import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
@ -12,6 +13,8 @@ import net.pokeranalytics.android.R
class BottomSheetEditTextFragment : BottomSheetFragment() { class BottomSheetEditTextFragment : BottomSheetFragment() {
private var value = ""
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initData() initData()
@ -23,6 +26,10 @@ class BottomSheetEditTextFragment : BottomSheetFragment() {
editText1.requestFocus() editText1.requestFocus()
} }
override fun getValue(): Any {
return value
}
/** /**
* Init data * Init data
*/ */
@ -41,13 +48,14 @@ class BottomSheetEditTextFragment : BottomSheetFragment() {
val data = getData() val data = getData()
if (data.size == 1) { if (data.size == 1) {
editText1.hint = data[0].hint
editText1.setText((data[0].defaultValue ?: "").toString()) data[0].hint?.let { editText1.hint = getString(it) }
editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT
editText1.addTextChangedListener { value = it?.toString() ?: "" }
editText1.setText((data[0].defaultValue ?: "").toString())
editText1.setOnEditorActionListener { v, actionId, event -> editText1.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_DONE) { if (actionId == EditorInfo.IME_ACTION_DONE) {
val value = editText1.text.toString()
bottomSheetDelegate.setValue(value, row) bottomSheetDelegate.setValue(value, row)
dismiss() dismiss()
true true

@ -24,7 +24,6 @@ enum class BottomSheetType {
interface BottomSheetDelegate { interface BottomSheetDelegate {
fun clickOnAdd(row: DynamicRowInterface) fun clickOnAdd(row: DynamicRowInterface)
fun clickOnClear(row: DynamicRowInterface) fun clickOnClear(row: DynamicRowInterface)
fun clickOnDone(row: DynamicRowInterface)
fun setValue(value: Any, row: DynamicRowInterface) fun setValue(value: Any, row: DynamicRowInterface)
} }
@ -45,7 +44,6 @@ open class BottomSheetFragment : BottomSheetDialogFragment() {
): BottomSheetFragment { ): BottomSheetFragment {
val bottomSheetFragment = when (row.bottomSheetType) { val bottomSheetFragment = when (row.bottomSheetType) {
BottomSheetType.DATE -> BottomSheetDateFragment()
BottomSheetType.LIST -> BottomSheetListFragment() BottomSheetType.LIST -> BottomSheetListFragment()
BottomSheetType.DOUBLE_LIST -> BottomSheetDoubleListFragment() BottomSheetType.DOUBLE_LIST -> BottomSheetDoubleListFragment()
BottomSheetType.EDIT_TEXT -> BottomSheetEditTextFragment() BottomSheetType.EDIT_TEXT -> BottomSheetEditTextFragment()
@ -100,13 +98,11 @@ open class BottomSheetFragment : BottomSheetDialogFragment() {
true true
} }
bottomSheetToolbar.menu.findItem(R.id.actionCheck).setOnMenuItemClickListener { bottomSheetToolbar.menu.findItem(R.id.actionCheck).setOnMenuItemClickListener {
bottomSheetDelegate.clickOnDone(row) bottomSheetDelegate.setValue(getValue(), row)
dismiss() dismiss()
true true
} }
} }
} }
/** /**
@ -116,6 +112,10 @@ open class BottomSheetFragment : BottomSheetDialogFragment() {
return data return data
} }
open fun getValue(): Any {
return Any()
}
/** /**
* Set clear button visibility * Set clear button visibility
*/ */

@ -0,0 +1,77 @@
package net.pokeranalytics.android.ui.fragment.components
import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.content.Context
import android.text.format.DateFormat
import android.widget.DatePicker
import android.widget.TimePicker
import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface
import java.util.*
class DateTimePickerManager : DatePickerDialog.OnDateSetListener,
TimePickerDialog.OnTimeSetListener {
private var context: Context? = null
private val calendar = Calendar.getInstance()
lateinit var row: DynamicRowInterface
lateinit var bottomSheetDelegate: BottomSheetDelegate
companion object {
fun create(
context: Context,
row: DynamicRowInterface,
bottomSheetDelegate: BottomSheetDelegate,
date: Date?
) : DateTimePickerManager {
val dateTimePickerManager = DateTimePickerManager()
dateTimePickerManager.context = context
dateTimePickerManager.showDatePicker()
dateTimePickerManager.row = row
dateTimePickerManager.bottomSheetDelegate = bottomSheetDelegate
return dateTimePickerManager
}
}
override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
calendar.set(Calendar.YEAR, year)
calendar.set(Calendar.MONTH, month)
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth)
showTimePicker()
}
override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay)
calendar.set(Calendar.MINUTE, minute)
bottomSheetDelegate.setValue(calendar.time, row)
}
/**
* Show the date picker
*/
private fun showDatePicker() {
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)
context?.let {
val datePickerDialog = DatePickerDialog(it, this, year, month, day)
datePickerDialog.show()
}
}
/**
* Show the time picker
*/
private fun showTimePicker() {
val hour = calendar.get(Calendar.YEAR)
val minute = calendar.get(Calendar.MONTH)
context?.let {
val timePickerDialog = TimePickerDialog(context, this, hour, minute, DateFormat.is24HourFormat(context))
timePickerDialog.show()
}
}
}

@ -0,0 +1,21 @@
package net.pokeranalytics.android.util
import java.text.DateFormat
import java.util.*
// Date
fun Date.short(): String {
return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(this)
}
fun Date.medium(): String {
return DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(this)
}
fun Date.full(): String {
return DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(this)
}

@ -15,7 +15,6 @@
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:textSize="18sp" android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:padding="16dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Title" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/value"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:ellipsize="end"
android:gravity="end|center_vertical"
android:maxLines="1"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/action"
app:layout_constraintStart_toEndOf="@+id/title"
app:layout_constraintTop_toTopOf="parent"
tools:text="Value" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/action"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:background="?selectableItemBackgroundBorderless"
android:padding="4dp"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/ic_close_white_24dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -7,8 +7,12 @@
<string name="bankroll">Bankroll</string> <string name="bankroll">Bankroll</string>
<string name="blinds">Blinds</string> <string name="blinds">Blinds</string>
<string name="small_blind">Small blind</string>
<string name="big_blind">Big blind</string>
<string name="game">Game</string> <string name="game">Game</string>
<string name="date">Date</string> <string name="date">Date</string>
<string name="start_date">Start date</string>
<string name="end_date">End date</string>
<string name="location">Location</string> <string name="location">Location</string>
<string name="session">Session</string> <string name="session">Session</string>
<string name="tournament_type">Tournament Type</string> <string name="tournament_type">Tournament Type</string>

Loading…
Cancel
Save