From ea6b0a29d5b89b033ce0ac32e8783d3ea0365315 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 2 Mar 2020 17:42:49 +0100 Subject: [PATCH] Progress made on the player selection --- .../android/ui/activity/DataListActivity.kt | 30 +++++++++-- .../ui/activity/components/BaseActivity.kt | 7 +++ .../android/ui/activity/components/Codes.kt | 1 + .../android/ui/fragment/DataListFragment.kt | 41 ++++++++++----- .../fragment/DataSelectionDialogFragment.kt | 50 +++++++++++++++++++ .../modules/handhistory/HandHistoryAdapter.kt | 16 +++++- .../handhistory/HandHistoryFragment.kt | 37 ++++++++------ .../handhistory/model/HandHistoryViewModel.kt | 19 +++++++ .../handhistory/model/PlayerSetupRow.kt | 2 +- .../android/ui/view/PlayerImageView.kt | 2 +- app/src/main/res/drawable/circle.xml | 12 +++-- .../main/res/layout/activity_data_list.xml | 13 ++--- .../layout/fragment_data_selection_dialog.xml | 13 +++-- .../layout/row_hhsettings_player_setup.xml | 15 +++--- app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/styles.xml | 6 +++ 16 files changed, 210 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt index 65a18b4b..7886348e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt @@ -4,10 +4,12 @@ import android.content.Context import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment -import kotlinx.android.synthetic.main.activity_data_list.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.activity.components.BaseActivity +import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.fragment.DataListFragment +import net.pokeranalytics.android.ui.fragment.DataSelectionDialogFragment import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode class DataListActivity : BaseActivity() { @@ -17,6 +19,7 @@ class DataListActivity : BaseActivity() { LIVE_DATA_TYPE("LIVE_DATA_TYPE"), ITEM_DELETED("ITEM_DELETED"), SHOW_ADD_BUTTON("SHOW_ADD_BUTTON"), + SELECTION_DIALOG("DIALOG") } companion object { @@ -29,10 +32,16 @@ class DataListActivity : BaseActivity() { fragment.startActivityForResult(getIntent(context, dataType, showAddButton), FilterActivityRequestCode.SELECT_FILTER.ordinal) } - private fun getIntent(context: Context, dataType: Int, showAddButton: Boolean = true): Intent { + fun newSelectionDialogInstance(fragment: Fragment, dataType: LiveData) { + val context = fragment.requireContext() + fragment.startActivityForResult(getIntent(context, dataType.ordinal, false, true), RequestCode.PLAYER_SELECTION.ordinal) + } + + private fun getIntent(context: Context, dataType: Int, showAddButton: Boolean = true, dialog: Boolean = false): Intent { val intent = Intent(context, DataListActivity::class.java) intent.putExtra(IntentKey.DATA_TYPE.keyName, dataType) intent.putExtra(IntentKey.SHOW_ADD_BUTTON.keyName, showAddButton) + intent.putExtra(IntentKey.SELECTION_DIALOG.keyName, dialog) return intent } } @@ -50,9 +59,20 @@ class DataListActivity : BaseActivity() { private fun initUI() { val dataType = intent.getIntExtra(IntentKey.DATA_TYPE.keyName, 0) val showAddButton = intent.getBooleanExtra(IntentKey.SHOW_ADD_BUTTON.keyName, true) - val fragment = dataListFragment as DataListFragment - fragment.setData(dataType) - fragment.updateUI(showAddButton) + val dialog = intent.getBooleanExtra(IntentKey.SELECTION_DIALOG.keyName, true) + + if (dialog) { + val dataSelectionDialogFragment = DataSelectionDialogFragment.newInstance(dataType) + this.showFragment(dataSelectionDialogFragment, R.id.container) + } else { + val dataListFragment = DataListFragment() + dataListFragment.setData(dataType) + dataListFragment.updateUI(showAddButton) + } + +// val fragment = dataListFragment as DataListFragment +// fragment.setData(dataType) +// fragment.updateUI(showAddButton) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt index 9407d1fa..72fcc72d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt @@ -9,6 +9,7 @@ import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment import com.crashlytics.android.Crashlytics import com.google.android.libraries.places.api.model.PlaceLikelihood import io.realm.Realm @@ -101,6 +102,12 @@ abstract class BaseActivity : AppCompatActivity() { return super.onOptionsItemSelected(item) } + fun showFragment(fragment: Fragment, containerId: Int) { + val fragmentTransaction = supportFragmentManager.beginTransaction() + fragmentTransaction.add(containerId, fragment) + fragmentTransaction.commit() + } + /** * Return the realm instance */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/Codes.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/Codes.kt index 3a5465a8..e9cd8ca3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/Codes.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/Codes.kt @@ -4,6 +4,7 @@ enum class RequestCode(var value: Int) { DEFAULT(1), FEED_MENU(100), FEED_TRANSACTION_DETAILS(101), + PLAYER_SELECTION(200), BANKROLL_DETAILS(700), BANKROLL_CREATE(701), BANKROLL_EDIT(702), diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index c11faa64..8da129be 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -44,7 +44,12 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS private var dataListMenu: Menu? = null private var searchView: SearchView? = null - var isSearchable: Boolean = false + /*** + * Returns the selected item on row selection + */ + private var isSelectionInstance: Boolean = false + + private var isSearchable: Boolean = false set(value) { field = value val searchMenuItem = dataListMenu?.findItem(R.id.action_search) @@ -94,7 +99,7 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS setDisplayHomeAsUpEnabled(true) val viewManager = LinearLayoutManager(requireContext()) - dataListAdapter = RowRepresentableAdapter(this, this) + this.dataListAdapter = RowRepresentableAdapter(this, this) val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position -> val item = this.items[position] @@ -169,18 +174,28 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { - when (this.dataType) { - LiveData.FILTER -> { - val intent = Intent() - intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) - activity?.setResult(Activity.RESULT_OK, intent) - activity?.finish() - } - else -> { - val identifier = (row as Identifiable).id - EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS) + if (this.isSelectionInstance) { + val identifier = (row as Identifiable).id + val intent = Intent() + intent.putExtra(BundleKey.PRIMARY_KEY.value, identifier) + this.activity?.setResult(Activity.RESULT_OK, intent) + this.activity?.finish() + } else { + + when (this.dataType) { + LiveData.FILTER -> { + val intent = Intent() + intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) + activity?.setResult(Activity.RESULT_OK, intent) + activity?.finish() + } + else -> { + val identifier = (row as Identifiable).id + EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS) + } } } + } /** @@ -195,7 +210,7 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS */ private fun filterItemsWithSearch(searchContent: String?) { this.items = getRealm().find(this.identifiableClass, searchContent) - dataListAdapter.notifyDataSetChanged() + this.dataListAdapter.notifyDataSetChanged() } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataSelectionDialogFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataSelectionDialogFragment.kt index 7407a24d..145500b7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataSelectionDialogFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataSelectionDialogFragment.kt @@ -1,2 +1,52 @@ package net.pokeranalytics.android.ui.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.DialogFragment +import kotlinx.android.synthetic.main.fragment_data_selection_dialog.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.PAIllegalStateException + +class DataSelectionDialogFragment : DialogFragment() { + + private enum class BundleKey(var value: String) { + DATA_TYPE("data_type") + } + + companion object { + + fun newInstance(dataType: Int): DataSelectionDialogFragment { + val df = DataSelectionDialogFragment() + val bundle = Bundle() + bundle.putSerializable(BundleKey.DATA_TYPE.value, dataType) + df.arguments = bundle + return df + } + + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + super.onCreateView(inflater, container, savedInstanceState) + return inflater.inflate(R.layout.fragment_data_selection_dialog, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDataListFragment() + } + + private fun initDataListFragment() { + + val dataListFragment = this.dataListFragment as DataListFragment + val dataType = this.arguments?.getInt(BundleKey.DATA_TYPE.value) ?: throw PAIllegalStateException("undefined datatype") + dataListFragment.setData(dataType) + + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryAdapter.kt index 11294dcb..5616257f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryAdapter.kt @@ -503,8 +503,11 @@ class HandHistoryAdapter( init { - itemView.ps_player_button.tag = PlayerSetupRow.Tag.PLAYER.ordinal - setOnClickListener(itemView.ps_player_button) + itemView.playerImage.tag = PlayerSetupRow.Tag.PLAYER.ordinal + +// itemView.ps_player_button.pointerIcon = +// itemView.ps_player_button.ti = itemView.resources.getDrawable(R.drawable.circle, null) +// setOnItemClickListener(itemView.playerImage) itemView.stack_edit_text.tag = PlayerSetupRow.Tag.STACK.ordinal itemView.stack_edit_text.inputType = InputType.TYPE_NUMBER_FLAG_DECIMAL @@ -525,6 +528,15 @@ class HandHistoryAdapter( val setupRow = row as PlayerSetupRow val state = setupRow.state + // Player + val listener = View.OnClickListener { + delegate?.onItemClick(position, row, itemView.playerImage.tag as Int) + } + itemView.playerImage.setOnImageClickListener(listener) + row.playerSetup?.player?.let { player -> + itemView.playerImage.setPlayer(player, isClickable = true) + } + // Title itemView.title.text = setupRow.title(itemView.context) val visibility = if (state == PlayerSetupRow.State.SETUP_ONLY && !setupRow.hero) View.GONE else View.VISIBLE diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt index bfdf693a..d58c782d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/HandHistoryFragment.kt @@ -13,11 +13,15 @@ import kotlinx.android.synthetic.main.fragment_hand_history.* import kotlinx.android.synthetic.main.fragment_settings.recyclerView import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.handhistory.HandSetup import net.pokeranalytics.android.model.handhistory.Position +import net.pokeranalytics.android.model.realm.Player import net.pokeranalytics.android.model.realm.handhistory.Action import net.pokeranalytics.android.model.realm.handhistory.Card import net.pokeranalytics.android.model.realm.handhistory.HandHistory +import net.pokeranalytics.android.ui.activity.DataListActivity +import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.fragment.components.RealmFragment @@ -91,15 +95,15 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL val handHistoryId = this.arguments?.getString(BundleKey.PRIMARY_KEY.value) handHistoryId?.let { - this.setEditing(false) val handHistory = getRealm().findById(it) ?: throw PAIllegalStateException("HandHistory not found") this.model.setHandHistory(handHistory) + this.setEditing(false) } ?: run { - this.setEditing(true) getRealm().executeTransaction { this.model.createNewHandHistory(it, HandSetup()) } + this.setEditing(true) } } @@ -182,6 +186,21 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL super.onCreateOptionsMenu(menu, inflater) } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + when (requestCode) { + RequestCode.PLAYER_SELECTION.ordinal -> { + val playerId = data?.getStringExtra(BundleKey.PRIMARY_KEY.value) ?: throw PAIllegalStateException("Primary key not set where as activity has finished") + getRealm().findById(playerId)?.let { player -> + this.model.playerSelected(player) + } ?: throw PAIllegalStateException("Player (id=$playerId) not found") + this.handHistoryAdapter.notifyDataSetChanged() + } + } + + } + /** * Update menu UI */ @@ -215,8 +234,6 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL */ private fun retrieveEditTextInputConnection(selection: HHSelection) { -// throw PAIllegalStateException("I believe this should not happen any more") - val handRow = this.model.rowRepresentableForPosition(selection.index) as? HandHistoryRow val holder = recyclerView.findViewHolderForAdapterPosition(selection.index) as? HandHistoryAdapter.RowHandHolder @@ -358,7 +375,8 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL is PlayerSetupRow -> { when (tag) { PlayerSetupRow.Tag.PLAYER.ordinal -> { - showPlayerSelectionFragment() + this.model.clickPosition = position + DataListActivity.newSelectionDialogInstance(this, LiveData.PLAYER) } else -> { Timber.d("onItemClick not configured for row: $row, position: $position, tag: $tag") @@ -367,15 +385,6 @@ class HandHistoryFragment : RealmFragment(), RowRepresentableDelegate, KeyboardL } } - } - - /*** - * Shows a window allowing a player selection - */ - private fun showPlayerSelectionFragment() { - - - } /*** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/HandHistoryViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/HandHistoryViewModel.kt index 013774f9..812019d5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/HandHistoryViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/HandHistoryViewModel.kt @@ -10,6 +10,7 @@ import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.handhistory.HandSetup import net.pokeranalytics.android.model.handhistory.Position import net.pokeranalytics.android.model.handhistory.Street +import net.pokeranalytics.android.model.realm.Player import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.handhistory.* import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource @@ -121,6 +122,11 @@ class HandHistoryViewModel : ViewModel(), RowRepresentableDataSource, CardCentra */ private var firstStraddlePosition: Position? = null + /*** + * The position of a click + */ + var clickPosition: Int? = null + /*** * The board cards sorted by position */ @@ -917,4 +923,17 @@ class HandHistoryViewModel : ViewModel(), RowRepresentableDataSource, CardCentra this.sortedActions.updateBigBlindRemainingStack() } + fun playerSelected(player: Player) { + this.clickPosition?.let { position -> + + when (val row = this.rowRepresentables[position]) { + is PlayerSetupRow -> { + val playerSetup = row.playerSetup ?: this.handHistory.createPlayerSetup(position) + playerSetup.player = player + } + } + + } ?: throw PAIllegalStateException("Click position not set for player selection") + } + } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/PlayerSetupRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/PlayerSetupRow.kt index 73dd1f0f..b3678dc9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/PlayerSetupRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/model/PlayerSetupRow.kt @@ -60,7 +60,6 @@ class PlayerSetupRow(var hero: Boolean = false, } } - override val viewType: Int get() { return if (this.readMode) { @@ -84,6 +83,7 @@ class PlayerSetupRow(var hero: Boolean = false, override fun keyboardForTag(tag: Int): HHKeyboard? { return when (tag) { + Tag.PLAYER.ordinal -> null Tag.POSITION.ordinal -> null Tag.HAND.ordinal -> HHKeyboard.CARD Tag.STACK.ordinal -> HHKeyboard.AMOUNT diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/PlayerImageView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/PlayerImageView.kt index 7d732ca2..72bd1537 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/PlayerImageView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/PlayerImageView.kt @@ -20,7 +20,7 @@ import net.pokeranalytics.android.ui.extensions.px /** - * Display a row session + * A class managing the display of a Player */ class PlayerImageView : FrameLayout { diff --git a/app/src/main/res/drawable/circle.xml b/app/src/main/res/drawable/circle.xml index 93111933..bb81366f 100644 --- a/app/src/main/res/drawable/circle.xml +++ b/app/src/main/res/drawable/circle.xml @@ -1,11 +1,15 @@ - - + + + + + android:width="48dp" + android:height="48dp"/> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_data_list.xml b/app/src/main/res/layout/activity_data_list.xml index 83171e1b..9cf654c0 100644 --- a/app/src/main/res/layout/activity_data_list.xml +++ b/app/src/main/res/layout/activity_data_list.xml @@ -3,13 +3,14 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:id="@+id/container" android:orientation="vertical"> - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_data_selection_dialog.xml b/app/src/main/res/layout/fragment_data_selection_dialog.xml index 3509b841..c92bed59 100644 --- a/app/src/main/res/layout/fragment_data_selection_dialog.xml +++ b/app/src/main/res/layout/fragment_data_selection_dialog.xml @@ -1,6 +1,13 @@ - - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_hhsettings_player_setup.xml b/app/src/main/res/layout/row_hhsettings_player_setup.xml index 465e87b1..f3480668 100644 --- a/app/src/main/res/layout/row_hhsettings_player_setup.xml +++ b/app/src/main/res/layout/row_hhsettings_player_setup.xml @@ -1,5 +1,6 @@ @@ -21,14 +22,14 @@ + android:layout_height="wrap_content" + android:layout_marginStart="8dp"> - + + #00FFFFFF + #141414 #0A0A0A #58C473 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c4322eaa..1441fee9 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -359,6 +359,12 @@ @color/kaki + +