From e7d1b1a231e7aadf8e4495ba0b9924493e912b7d Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 14 Feb 2019 15:53:31 +0100 Subject: [PATCH] Start bottom sheet customization --- .../adapter/components/DynamicListAdapter.kt | 2 +- .../adapter/components/DynamicRowInterface.kt | 104 +++++++------ .../ui/fragment/BottomSheetFragment.kt | 137 +++++++++++++++--- .../android/ui/fragment/NewSessionFragment.kt | 11 +- .../android/ui/fragment/SettingsFragment.kt | 2 +- .../ui/fragment/components/BottomSheetType.kt | 13 ++ .../android/util/PokerAnalyticsFragment.kt | 3 +- 7 files changed, 193 insertions(+), 79 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetType.kt 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 9cd13d2a..4b047693 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 @@ -6,7 +6,7 @@ import android.widget.Toast import androidx.recyclerview.widget.RecyclerView import io.realm.Realm.init -interface EditableDataDelegate : DynamicRowDelegate { +interface EditableDataDelegate { fun setValue(value: Any, row: DynamicRowInterface) } 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 1ef17b2d..138681c6 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 @@ -2,69 +2,77 @@ package net.pokeranalytics.android.ui.adapter.components import android.content.Context import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.fragment.components.BottomSheetType -class SectionRow(stringRes: Int) : DynamicRowInterface { - - var stringRes: Int = stringRes - - override fun localizedTitle(context: Context): String { - return context.getString(this.stringRes) - } - - override var viewType: Int = 0 - +interface DynamicRowInterface { + fun localizedTitle(context: Context): String + var viewType: Int + var bottomSheetType: BottomSheetType } -interface DynamicRowInterface { +class SectionRow(stringRes: Int) : DynamicRowInterface { - fun localizedTitle(context: Context): String - var viewType: Int + var stringRes: Int = stringRes + override fun localizedTitle(context: Context): String { + return context.getString(this.stringRes) + } + + override var viewType: Int = 0 + override var bottomSheetType: BottomSheetType = BottomSheetType.NONE } enum class SessionRow(val resId: Int) : DynamicRowInterface { - BLINDS(R.string.app_name), - GAME(R.string.title_history), - DATE(R.string.title_settings); - - override fun localizedTitle(context: Context): String { - return context.getString(this.resId) - } - - override var viewType: Int = RowViewType.HEADER.ordinal - get() { - return when (this) { - BLINDS, GAME, DATE -> RowViewType.TITLE_VALUE.ordinal - } - } - + BLINDS(R.string.app_name), + GAME(R.string.title_history), + DATE(R.string.title_settings); + + override fun localizedTitle(context: Context): String { + return context.getString(this.resId) + } + + override var viewType: Int = RowViewType.HEADER.ordinal + get() { + return when (this) { + BLINDS, GAME, DATE -> RowViewType.TITLE_VALUE.ordinal + } + } + + override var bottomSheetType: BottomSheetType = BottomSheetType.NONE + get() { + return when (this) { + BLINDS -> BottomSheetType.BLINDS + GAME -> BottomSheetType.GAME + DATE -> BottomSheetType.DATE + } + } } enum class BankrollRow(val resId: Int) : DynamicRowInterface { - NAME(R.string.app_name), - LIVE(R.string.app_name), - CURRENCY(R.string.app_name); + NAME(R.string.app_name), + LIVE(R.string.app_name), + CURRENCY(R.string.app_name); - override fun localizedTitle(context: Context): String { - return context.getString(this.resId) - } - - override var viewType: Int = 1 + override fun localizedTitle(context: Context): String { + return context.getString(this.resId) + } + override var viewType: Int = 1 + override var bottomSheetType: BottomSheetType = BottomSheetType.NONE } enum class BusinessObjectRowType(val resId: Int) : DynamicRowInterface { - BANKROLL(R.string.bankroll), - GAME(R.string.game), - LOCATION(R.string.location), - TOURNAMENT_TYPE(R.string.tournament_type), - TRANSACTION_TYPE(R.string.transaction_type); - - override fun localizedTitle(context: Context): String { - return context.getString(this.resId) - } - - override var viewType: Int = RowViewType.TITLE.ordinal - + BANKROLL(R.string.bankroll), + GAME(R.string.game), + LOCATION(R.string.location), + TOURNAMENT_TYPE(R.string.tournament_type), + TRANSACTION_TYPE(R.string.transaction_type); + + override fun localizedTitle(context: Context): String { + return context.getString(this.resId) + } + + override var viewType: Int = RowViewType.TITLE.ordinal + override var bottomSheetType: BottomSheetType = BottomSheetType.NONE } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BottomSheetFragment.kt index c1970ca4..b306cdfd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BottomSheetFragment.kt @@ -1,21 +1,76 @@ package net.pokeranalytics.android.ui.fragment +import android.app.DatePickerDialog import android.os.Bundle import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import kotlinx.android.synthetic.main.fragment_bottom_sheet_container.* -import android.content.Context import android.content.DialogInterface import android.view.* -import android.view.inputmethod.InputMethodManager - +import androidx.constraintlayout.widget.ConstraintLayout +import kotlinx.android.synthetic.main.bottom_sheet_blinds.* +import kotlinx.android.synthetic.main.bottom_sheet_date.* +import kotlinx.android.synthetic.main.fragment_bottom_sheet.* +import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* +import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface +import net.pokeranalytics.android.ui.adapter.components.EditableDataDelegate +import net.pokeranalytics.android.ui.fragment.components.BottomSheetType +import timber.log.Timber +import android.widget.DatePicker +import net.pokeranalytics.android.util.DatePickerFragment +import net.pokeranalytics.android.util.TimePickerFragment +import java.util.* class BottomSheetFragment : BottomSheetDialogFragment() { + private var row: DynamicRowInterface? = null + private var valueDelegate: EditableDataDelegate? = null + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + val view = inflater.inflate( + net.pokeranalytics.android.R.layout.fragment_bottom_sheet, + container, + false + ) as ConstraintLayout + + row?.let { + when (it.bottomSheetType) { + BottomSheetType.BANKROLL -> inflater.inflate( + net.pokeranalytics.android.R.layout.bottom_sheet_bankroll, + view.bottomSheetContainer, + true + ) + BottomSheetType.BLINDS -> inflater.inflate( + net.pokeranalytics.android.R.layout.bottom_sheet_blinds, + view.bottomSheetContainer, + true + ) + BottomSheetType.DATE -> inflater.inflate( + net.pokeranalytics.android.R.layout.bottom_sheet_date, + view.bottomSheetContainer, + true + ) + BottomSheetType.GAME -> inflater.inflate( + net.pokeranalytics.android.R.layout.bottom_sheet_game, + view.bottomSheetContainer, + true + ) + BottomSheetType.LOCATION -> inflater.inflate( + net.pokeranalytics.android.R.layout.bottom_sheet_location, + view.bottomSheetContainer, + true + ) + BottomSheetType.TABLE_SIZE -> inflater.inflate( + net.pokeranalytics.android.R.layout.bottom_sheet_table_size, + view.bottomSheetContainer, + true + ) + else -> { + } + } + } - return inflater.inflate(net.pokeranalytics.android.R.layout.fragment_bottom_sheet_container, container, false) + return view } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -23,46 +78,80 @@ class BottomSheetFragment : BottomSheetDialogFragment() { initUI() } + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + // To display correctly the keyboard + dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) + } + override fun onStart() { super.onStart() // Open the keyboard - /* - val inputMethodManager = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0) - editText.requestFocus() - */ + row?.let { + when (it.bottomSheetType) { + BottomSheetType.BLINDS -> { + smallBlind.requestFocus() + } + else -> { + } + } + } } - /** - * Actions: - * - Add / Add ? - * - Clear / Garbage ? - * - Done / Check ? - * - - */ - override fun onDismiss(dialog: DialogInterface?) { super.onDismiss(dialog) - val inputMethodManager = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0) + + // Return the value + row?.let { + valueDelegate?.setValue("Test", it) + } } /** * Init UI */ private fun initUI() { - close.setOnClickListener { - dismiss() + + row?.let { + //bottomSheetToolbar.title = row?.localizedTitle(requireContext()) + bottomSheetToolbar.inflateMenu(net.pokeranalytics.android.R.menu.bottom_sheet_menu) + bottomSheetToolbar.setOnMenuItemClickListener { + false + } + } + + row?.let { + when (it.bottomSheetType) { + BottomSheetType.DATE -> initDateUI() + else -> {} + } } } /** - * + * Init date UI */ - fun displayDataForRow() { + private fun initDateUI() { + + startDate.setOnClickListener { + val dateFragment = DatePickerFragment() + dateFragment.show(fragmentManager, "datePicker") + } + + endDate.setOnClickListener { + val timeFragment = TimePickerFragment() + timeFragment.show(fragmentManager, "timePicker") + } } + /** + * Init + */ + fun init(row: DynamicRowInterface, valueDelegate: EditableDataDelegate) { + this.row = row + this.valueDelegate = valueDelegate + } } \ No newline at end of file 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 1b0d7def..2daa7e57 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 @@ -18,9 +18,10 @@ import net.pokeranalytics.android.ui.adapter.NewSessionAdapter import net.pokeranalytics.android.ui.adapter.components.DynamicListAdapter import net.pokeranalytics.android.ui.adapter.components.DynamicRowCallback import net.pokeranalytics.android.ui.adapter.components.DynamicRowInterface +import net.pokeranalytics.android.ui.adapter.components.EditableDataDelegate import net.pokeranalytics.android.util.PokerAnalyticsFragment -class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback { +class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback, EditableDataDelegate { private lateinit var newSession: Session @@ -30,13 +31,17 @@ class NewSessionFragment : PokerAnalyticsFragment(), DynamicRowCallback { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initData() initUI() } override fun onRowSelected(row: DynamicRowInterface) { - val bottomSheetFragment = openBottomSheet(row) + val bottomSheetFragment = openBottomSheet() + bottomSheetFragment.init(row, this) + } + + override fun setValue(value: Any, row: DynamicRowInterface) { + Toast.makeText(requireContext(), "Callback for ${row.localizedTitle(requireContext())} ($value)", Toast.LENGTH_SHORT).show() } private fun initData() { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index 499a5ad6..e6ee295c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -45,7 +45,7 @@ class SettingsFragment : PokerAnalyticsFragment(), DynamicRowDelegate, DynamicRo } override fun onRowSelected(row: DynamicRowInterface) { - val bottomSheetFragment = openBottomSheet(row) + //val bottomSheetFragment = openBottomSheet(row) } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetType.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetType.kt new file mode 100644 index 00000000..61127db5 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BottomSheetType.kt @@ -0,0 +1,13 @@ +package net.pokeranalytics.android.ui.fragment.components + +enum class BottomSheetType { + + NONE, + GAME, + BLINDS, + LOCATION, + BANKROLL, + TABLE_SIZE, + DATE + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/PokerAnalyticsFragment.kt b/app/src/main/java/net/pokeranalytics/android/util/PokerAnalyticsFragment.kt index 6687471e..754429c3 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/PokerAnalyticsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/PokerAnalyticsFragment.kt @@ -27,8 +27,7 @@ open class PokerAnalyticsFragment: Fragment() { /** * Open the bottom sheet */ - fun openBottomSheet(row: DynamicRowInterface): BottomSheetFragment { - //TODO: Give the data to display in the bottom sheet here + fun openBottomSheet(): BottomSheetFragment { val bottomSheetFragment = BottomSheetFragment() bottomSheetFragment.show(fragmentManager, "bottomSheet") return bottomSheetFragment