diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index 549b39f8..72422531 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -63,7 +63,7 @@ open class Bankroll(name: String = "") : RealmObject(), DynamicRowDelegate, Disp override fun getBottomSheetData(row: DynamicRowInterface): ArrayList { val data = java.util.ArrayList() 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 } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index 4b648e31..d44a528b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -39,7 +39,7 @@ open class Game : RealmObject(), DynamicRowDelegate, DisplayableDataSource, Edit override fun getBottomSheetData(row: DynamicRowInterface): ArrayList { val data = java.util.ArrayList() 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 } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index 2292595f..2566bf61 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -43,7 +43,7 @@ open class Location : RealmObject(), DynamicRowDelegate, DisplayableDataSource, override fun getBottomSheetData(row: DynamicRowInterface): ArrayList { val data = java.util.ArrayList() 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 } 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 11cd2108..37745774 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 @@ -4,11 +4,13 @@ import android.text.InputType import io.realm.* import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.SessionInterface import net.pokeranalytics.android.model.DataList import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.fragment.components.BottomSheetData import net.pokeranalytics.android.util.data.sessionDao +import net.pokeranalytics.android.util.short import java.util.* import kotlin.collections.ArrayList @@ -142,12 +144,23 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa SessionRow.GAME -> game?.title ?: "--" SessionRow.LOCATION -> location?.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 "--" 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 val primaryKey: String get() = this.id @@ -155,27 +168,22 @@ open class Session : RealmObject(), SessionInterface, DynamicRowDelegate, Displa val data = ArrayList() - // Todo: Localize & set real data when (row) { 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 -> { - data.add(BottomSheetData(location, "", 0, DataList.LOCATION.items(realm))) + data.add(BottomSheetData(location, inputType = InputType.TYPE_NULL, data = DataList.LOCATION.items(realm))) } SessionRow.BANKROLL -> { - data.add(BottomSheetData(bankroll, "", 0, DataList.BANKROLL.items(realm))) - } - SessionRow.DATE -> { - data.add(BottomSheetData(timeFrame?.startDate, "Start date")) - data.add(BottomSheetData(timeFrame?.endDate, "End date")) + data.add(BottomSheetData(bankroll, inputType = InputType.TYPE_NULL, data = DataList.BANKROLL.items(realm))) } SessionRow.BLINDS -> { - data.add(BottomSheetData(cgSmallBlind, "Small blind", InputType.TYPE_CLASS_NUMBER)) - data.add(BottomSheetData(cgBigBlind, "Big blind", InputType.TYPE_CLASS_NUMBER)) + data.add(BottomSheetData(cgSmallBlind, R.string.small_blind, InputType.TYPE_CLASS_NUMBER)) + data.add(BottomSheetData(cgBigBlind, R.string.big_blind, InputType.TYPE_CLASS_NUMBER)) } SessionRow.COMMENT -> { - data.add(BottomSheetData(comment, "Comment", InputType.TYPE_CLASS_TEXT)) + data.add(BottomSheetData(comment, R.string.comment, InputType.TYPE_CLASS_TEXT)) } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index 64107524..6f6277cc 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -37,7 +37,7 @@ open class TournamentFeature : RealmObject(), DynamicRowDelegate, DisplayableDat override fun getBottomSheetData(row: DynamicRowInterface): ArrayList { val data = java.util.ArrayList() 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 } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index f9ca1894..da1b7ed0 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt @@ -46,7 +46,7 @@ open class TransactionType : RealmObject(), DynamicRowDelegate, DisplayableDataS override fun getBottomSheetData(row: DynamicRowInterface): ArrayList { val data = java.util.ArrayList() 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 } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicListAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicListAdapter.kt index 83778819..ee87cb0e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicListAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicListAdapter.kt @@ -5,15 +5,24 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView interface EditableDataDelegate { - fun setValue(value: Any, row: DynamicRowInterface) + fun setValue(value: Any, row: DynamicRowInterface) } interface DynamicRowDelegate { - fun adapterRows() : ArrayList + fun adapterRows(): ArrayList - fun boolForRow(row: DynamicRowInterface) : Boolean { return false } - fun stringForRow(row: DynamicRowInterface) : String { return "" } + fun boolForRow(row: DynamicRowInterface): Boolean { + return false + } + + fun stringForRow(row: DynamicRowInterface): String { + return "" + } + + fun actionIconForRow(row: DynamicRowInterface): Int? { + return 0 + } /** * Manages: @@ -27,36 +36,44 @@ interface DynamicRowDelegate { } 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() { +class DynamicListAdapter(var delegate: DynamicRowDelegate, var callBackDelegate: DynamicRowCallback? = null) : + RecyclerView.Adapter() { + + private var rows: ArrayList = ArrayList() + + init { + this.rows = delegate.adapterRows() + } + + override fun getItemViewType(position: Int): Int { + return this.rows[position].viewType + } - private var rows: ArrayList = ArrayList() + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val rowViewType: RowViewType = RowViewType.values()[viewType] + return rowViewType.viewHolder(parent) + } - init { - this.rows = delegate.adapterRows() - } + override fun getItemCount(): Int { + return this.rows.size + } - override fun getItemViewType(position: Int): Int { - return this.rows[position].viewType - } + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val dynamicRow = this.rows[position] - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - val rowViewType: RowViewType = RowViewType.values()[viewType] - return rowViewType.viewHolder(parent) - } + val listener = View.OnClickListener { + callBackDelegate?.onRowSelected(dynamicRow) + } - override fun getItemCount(): Int { - return this.rows.size - } + val actionListener = View.OnClickListener { + callBackDelegate?.onActionSelected(dynamicRow) + } - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - val dynamicRow = this.rows[position] - val listener = View.OnClickListener { - callBackDelegate?.onRowSelected(dynamicRow) - } - (holder as DynamicHolder).bind(dynamicRow, this.delegate, listener) - } + (holder as DynamicHolder).bind(dynamicRow, this.delegate, listener, actionListener) + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicRowInterface.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicRowInterface.kt index e55491ce..e058dc3d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicRowInterface.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/DynamicRowInterface.kt @@ -38,7 +38,8 @@ enum class SessionRow(val resId: Int) : DynamicRowInterface { BLINDS(R.string.blinds), LOCATION(R.string.location), BANKROLL(R.string.bankroll), - DATE(R.string.date), + START_DATE(R.string.start_date), + END_DATE(R.string.end_date), COMMENT(R.string.comment); override fun localizedTitle(context: Context): String { @@ -48,7 +49,8 @@ enum class SessionRow(val resId: Int) : DynamicRowInterface { override val viewType: Int get() { 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 LOCATION -> BottomSheetType.LIST BANKROLL -> BottomSheetType.LIST - DATE -> BottomSheetType.DATE COMMENT -> BottomSheetType.EDIT_TEXT + else -> BottomSheetType.NONE } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/RowViewType.kt index 89782d78..7886c073 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/RowViewType.kt @@ -4,64 +4,89 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup 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 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 { - HEADER, - EDIT_TEXT, - TITLE, - TITLE_VALUE; + HEADER, + EDIT_TEXT, + TITLE, + TITLE_VALUE, + TITLE_VALUE_ACTION; - inner class FakeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { - override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener) { - } - } + inner class FakeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { + override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener, actionListener: View.OnClickListener?) { + } + } - inner class TitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { - override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener) { - itemView.title.text = row.localizedTitle(itemView.context) + inner class TitleViewHolder(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) + itemView.container.setOnClickListener(listener) + } + } - delegate?.let { - itemView.value.text = it.stringForRow(row) - } - itemView.container.setOnClickListener(listener) - } - } + inner class TitleValueViewHolder(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) - inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), DynamicHolder { - override fun bind(row: DynamicRowInterface, delegate: DynamicRowDelegate?, listener: View.OnClickListener) { - itemView.title.text = row.localizedTitle(itemView.context) - itemView.container.setOnClickListener(listener) - } - } + delegate?.let { + itemView.value.text = it.stringForRow(row) + } + 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 { - return when (this) { - TITLE_VALUE -> TitleValueViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_title_value, - parent, - false - ) - ) - TITLE -> TitleViewHolder( - LayoutInflater.from(parent.context).inflate( - R.layout.row_title, - parent, - false - ) - ) + val value = rowDelegate.stringForRow(row) + itemView.value.text = value + itemView.action.visibility = if (value == "--") View.GONE else View.VISIBLE + rowDelegate.actionIconForRow(row)?.let {icon -> + itemView.action.setImageResource(icon) + } + } + itemView.container.setOnClickListener(listener) + itemView.action.setOnClickListener(actionListener) + } + } - 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) + } + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index dbdb5ee8..c1a64cfd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -49,10 +49,6 @@ class EditableDataFragment : PokerAnalyticsFragment(), DynamicRowCallback, Botto 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) { (this.item as EditableDataSource).setBottomSheetValue(value, row) this.getRealm().executeTransaction { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/NewSessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/NewSessionFragment.kt index 0ee3bd72..926d349a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/NewSessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/NewSessionFragment.kt @@ -8,8 +8,8 @@ import android.widget.Toast import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.fragment_new_session.* import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.realm.* 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.components.PokerAnalyticsActivity 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.fragment.components.BottomSheetDelegate 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 java.util.* class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, BottomSheetDelegate { @@ -37,7 +39,15 @@ class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, BottomS override fun onRowSelected(row: DynamicRowInterface) { 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) { @@ -62,20 +72,26 @@ class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, BottomS 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) { when(row) { SessionRow.GAME -> if (value is Game) currentSession.game = value SessionRow.BANKROLL -> if (value is Bankroll) currentSession.bankroll = 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<*>) { currentSession.cgSmallBlind = (value[0] 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)) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetData.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetData.kt index 978ba7f2..5c0f2184 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetData.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetData.kt @@ -5,7 +5,7 @@ import io.realm.RealmResults class BottomSheetData( var defaultValue: Any? = null, - var hint: String? = "", + var hint: Int? = null, var inputType: Int? = InputType.TYPE_CLASS_TEXT, var data: RealmResults<*>? = null ) \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDateFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDateFragment.kt deleted file mode 100644 index e31aecff..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDateFragment.kt +++ /dev/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() - } - -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDoubleEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDoubleEditTextFragment.kt index 889c0ba5..c72c3cd3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDoubleEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetDoubleEditTextFragment.kt @@ -5,6 +5,7 @@ import android.text.InputType import android.view.LayoutInflater import android.view.View 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.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R @@ -12,6 +13,8 @@ import net.pokeranalytics.android.R class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { + private val values = ArrayList() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initData() @@ -23,6 +26,10 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { editText1.requestFocus() } + override fun getValue(): Any { + return values + } + /** * Init data */ @@ -36,24 +43,26 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { val data = getData() + values.add(0, "") + values.add(1, "") + LayoutInflater.from(requireContext()) .inflate(R.layout.bottom_sheet_double_edit_text, view?.bottomSheetContainer, true) if (data.size == 2) { - 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.addTextChangedListener { values[0] = it?.toString() ?: "" } + editText1.setText((data[0].defaultValue ?: "").toString()) - editText2.hint = data[1].hint - editText2.setText((data[1].defaultValue ?: "").toString()) + data[1].hint?.let { editText2.hint = getString(it) } 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 -> if (actionId == EditorInfo.IME_ACTION_DONE) { - val values = ArrayList() - values.add(editText1.text.toString()) - values.add(editText2.text.toString()) bottomSheetDelegate.setValue(values, row) dismiss() true @@ -61,10 +70,8 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { false } } - } - } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetEditTextFragment.kt index fbe15f63..2fe5454c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetEditTextFragment.kt @@ -5,6 +5,7 @@ import android.text.InputType import android.view.LayoutInflater import android.view.View import android.view.inputmethod.EditorInfo +import androidx.core.widget.addTextChangedListener import kotlinx.android.synthetic.main.bottom_sheet_edit_text.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R @@ -12,6 +13,8 @@ import net.pokeranalytics.android.R class BottomSheetEditTextFragment : BottomSheetFragment() { + private var value = "" + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initData() @@ -23,6 +26,10 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { editText1.requestFocus() } + override fun getValue(): Any { + return value + } + /** * Init data */ @@ -41,13 +48,14 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { val data = getData() 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.addTextChangedListener { value = it?.toString() ?: "" } + editText1.setText((data[0].defaultValue ?: "").toString()) editText1.setOnEditorActionListener { v, actionId, event -> if (actionId == EditorInfo.IME_ACTION_DONE) { - val value = editText1.text.toString() bottomSheetDelegate.setValue(value, row) dismiss() true diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetFragment.kt index 01d27d32..869e689f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetFragment.kt @@ -24,7 +24,6 @@ enum class BottomSheetType { interface BottomSheetDelegate { fun clickOnAdd(row: DynamicRowInterface) fun clickOnClear(row: DynamicRowInterface) - fun clickOnDone(row: DynamicRowInterface) fun setValue(value: Any, row: DynamicRowInterface) } @@ -45,7 +44,6 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { ): BottomSheetFragment { val bottomSheetFragment = when (row.bottomSheetType) { - BottomSheetType.DATE -> BottomSheetDateFragment() BottomSheetType.LIST -> BottomSheetListFragment() BottomSheetType.DOUBLE_LIST -> BottomSheetDoubleListFragment() BottomSheetType.EDIT_TEXT -> BottomSheetEditTextFragment() @@ -100,13 +98,11 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { true } bottomSheetToolbar.menu.findItem(R.id.actionCheck).setOnMenuItemClickListener { - bottomSheetDelegate.clickOnDone(row) + bottomSheetDelegate.setValue(getValue(), row) dismiss() true } - } - } /** @@ -116,6 +112,10 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { return data } + open fun getValue(): Any { + return Any() + } + /** * Set clear button visibility */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimeDialogFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimeDialogFragment.kt new file mode 100644 index 00000000..4bd4c822 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DateTimeDialogFragment.kt @@ -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() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/Extensions.kt b/app/src/main/java/net/pokeranalytics/android/util/Extensions.kt new file mode 100644 index 00000000..07b21294 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/Extensions.kt @@ -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) +} \ No newline at end of file diff --git a/app/src/main/res/layout/row_title_value.xml b/app/src/main/res/layout/row_title_value.xml index 079f9c7f..c89838b7 100644 --- a/app/src/main/res/layout/row_title_value.xml +++ b/app/src/main/res/layout/row_title_value.xml @@ -15,7 +15,6 @@ 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" diff --git a/app/src/main/res/layout/row_title_value_action.xml b/app/src/main/res/layout/row_title_value_action.xml new file mode 100644 index 00000000..abac5442 --- /dev/null +++ b/app/src/main/res/layout/row_title_value_action.xml @@ -0,0 +1,58 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 457e0d52..6f6f9e67 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,8 +7,12 @@ Bankroll Blinds + Small blind + Big blind Game Date + Start date + End date Location Session Tournament Type