From 2358e662ccfd1a1bd79bb01afdadb1281518c500 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 19 Mar 2019 13:58:09 +0100 Subject: [PATCH 1/3] Improve Filter management / wip --- app/src/main/AndroidManifest.xml | 6 +- .../ui/activity/FilterDetailsActivity.kt | 60 ++++++ .../{FilterActivity.kt => FiltersActivity.kt} | 12 +- .../android/ui/activity/HomeActivity.kt | 2 +- ...taFragment.kt => FilterDetailsFragment.kt} | 37 +++- .../android/ui/fragment/FiltersFragment.kt | 191 ++++++++++++++++++ .../android/ui/view/RowViewType.kt | 3 +- .../rowrepresentable/FilterCategoryRow.kt | 91 +++++++++ .../ui/view/rowrepresentable/FilterRow.kt | 50 ----- .../rowrepresentable/FilterSubcategoryRow.kt | 113 +++++++++++ ...filter.xml => activity_filter_details.xml} | 0 app/src/main/res/layout/activity_filters.xml | 7 + ...filter.xml => fragment_filter_details.xml} | 0 app/src/main/res/layout/fragment_filters.xml | 61 ++++++ 14 files changed, 563 insertions(+), 70 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/FilterDetailsActivity.kt rename app/src/main/java/net/pokeranalytics/android/ui/activity/{FilterActivity.kt => FiltersActivity.kt} (76%) rename app/src/main/java/net/pokeranalytics/android/ui/fragment/{FilterDataFragment.kt => FilterDetailsFragment.kt} (83%) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt delete mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSubcategoryRow.kt rename app/src/main/res/layout/{activity_filter.xml => activity_filter_details.xml} (100%) create mode 100644 app/src/main/res/layout/activity_filters.xml rename app/src/main/res/layout/{fragment_filter.xml => fragment_filter_details.xml} (100%) create mode 100644 app/src/main/res/layout/fragment_filters.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e581fdd5..f3d02022 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,7 +42,11 @@ android:launchMode="singleTop" /> + + FilterActivity.newInstance(this@HomeActivity) + 0 -> FiltersActivity.newInstance(this@HomeActivity) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt similarity index 83% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDataFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index cc530abe..95349e78 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -4,8 +4,8 @@ import android.os.Bundle import android.view.* import androidx.recyclerview.widget.LinearLayoutManager import io.realm.RealmObject -import kotlinx.android.synthetic.main.fragment_editable_data.* -import kotlinx.android.synthetic.main.fragment_filter.view.* +import kotlinx.android.synthetic.main.fragment_filter_details.* +import kotlinx.android.synthetic.main.fragment_filter_details.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -13,10 +13,11 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.FilterRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow +import timber.log.Timber -open class FilterDataFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { +open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { lateinit var parentActivity: PokerAnalyticsActivity lateinit var item: RealmObject @@ -25,14 +26,13 @@ open class FilterDataFragment : PokerAnalyticsFragment(), StaticRowRepresentable private var rows: ArrayList = ArrayList() private var filterMenu: Menu? = null - private var dataType: Int? = null - private var primaryKey: String? = null + private var filterCategory: FilterCategoryRow? = null var isUpdating = false var shouldOpenKeyboard = true override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_filter, container, false) + return inflater.inflate(R.layout.fragment_filter_details, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -93,12 +93,22 @@ open class FilterDataFragment : PokerAnalyticsFragment(), StaticRowRepresentable */ private fun initData() { + Timber.d("initData") + this.appBar.toolbar.title = getString(R.string.filter) - rows.addAll(FilterRow.values()) + filterCategory?.let { + + this.appBar.toolbar.title = it.localizedTitle(requireContext()) + + this.rows.clear() + this.rows.addAll(it.getSubcategories()) + Timber.d("initData: ${this.rows.size}") + + this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) + this.recyclerView.adapter = rowRepresentableAdapter - this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) - this.recyclerView.adapter = rowRepresentableAdapter + } /* if (this.dataType != null) { @@ -199,7 +209,12 @@ open class FilterDataFragment : PokerAnalyticsFragment(), StaticRowRepresentable /** * Set fragment data */ - fun setData(dataType: Int, primaryKey: String?) { + fun setData(filterCategory: Int) { + + Timber.d("Filter Category: ${FilterCategoryRow.values()[filterCategory]}") + Timber.d("Filter Subcategories: ${FilterCategoryRow.values()[filterCategory].getSubcategories()}") + this.filterCategory = FilterCategoryRow.values()[filterCategory] + /* this.dataType = dataType this.liveDataType = LiveData.values()[dataType] diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt new file mode 100644 index 00000000..ed9186d9 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt @@ -0,0 +1,191 @@ +package net.pokeranalytics.android.ui.fragment + +import android.os.Bundle +import android.view.* +import androidx.recyclerview.widget.LinearLayoutManager +import io.realm.RealmObject +import kotlinx.android.synthetic.main.fragment_editable_data.* +import kotlinx.android.synthetic.main.fragment_filters.view.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.activity.FilterDetailsActivity +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter +import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate +import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource +import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow +import timber.log.Timber + + +open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { + + lateinit var parentActivity: PokerAnalyticsActivity + lateinit var item: RealmObject + lateinit var rowRepresentableAdapter: RowRepresentableAdapter + + private var rows: ArrayList = ArrayList() + private var filterMenu: Menu? = null + private var dataType: Int? = null + private var primaryKey: String? = null + + var isUpdating = false + var shouldOpenKeyboard = true + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_filters, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initUI() + initData() + } + + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + /* + inflater?.inflate(R.menu.editable_data, menu) + this.filterMenu = menu + */ + updateMenuUI() + super.onCreateOptionsMenu(menu, inflater) + } + + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item!!.itemId) { + R.id.save -> saveData() + R.id.delete -> deleteData() + } + return true + } + + override fun adapterRows(): List? { + return rows + } + + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + super.onRowSelected(position, row, fromAction) + + if (row is FilterCategoryRow) { + Timber.d("Subcategories: ${row.getSubcategories()}") + FilterDetailsActivity.newInstanceForResult(this, row.ordinal, 1000) + } + + } + + override fun onRowValueChanged(value: Any?, row: RowRepresentable) { + super.onRowValueChanged(value, row) + } + + /** + * Init UI + */ + private fun initUI() { + parentActivity = activity as PokerAnalyticsActivity + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) + + val viewManager = LinearLayoutManager(requireContext()) + + recyclerView.apply { + setHasFixedSize(true) + layoutManager = viewManager + } + } + + /** + * Init data + */ + private fun initData() { + + this.appBar.toolbar.title = getString(R.string.filter) + + rows.addAll(FilterCategoryRow.values()) + + this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) + this.recyclerView.adapter = rowRepresentableAdapter + + } + + /** + * Update menu UI + */ + private fun updateMenuUI() { + /* + editableMenu?.findItem(R.id.delete)?.isVisible = isUpdating + editableMenu?.findItem(R.id.save)?.isVisible = true + */ + } + + /** + * Save data + */ + fun saveData() { + /* + if ((this.item as Savable).isValidForSave()) { + this.getRealm().executeTransaction { + val item = it.copyToRealmOrUpdate(this.item) + + val uniqueIdentifier = if (item is Identifiable) { + item.id + } else "" + + finishActivityWithResult(uniqueIdentifier) + } + } else { + val message = (this.item as Savable).getFailedSaveMessage() + val builder = AlertDialog.Builder(requireContext()) + .setMessage(message) + .setNegativeButton(R.string.ok, null) + builder.show() + } + */ + } + + /** + * Delete data + */ + private fun deleteData() { + /* + val builder = AlertDialog.Builder(requireContext()) + builder.setTitle(R.string.warning) + .setMessage(R.string.are_you_sure_you_want_to_do_that_) + .setNegativeButton(R.string.no, null) + .setPositiveButton(R.string.yes) { _, _ -> + //TODO: Maybe update this code, does the object need to be managed? + this.getRealm().executeTransaction { + this.liveDataType.deleteData(it, (this.item as Manageable)) + } + this.activity?.finish() + } + builder.show() + */ + } + + /** + * Finish the activity with a result + */ + private fun finishActivityWithResult(uniqueIdentifier: String) { + /* + val intent = Intent() + intent.putExtra(EditableDataActivity.IntentKey.DATA_TYPE.keyName, dataType) + intent.putExtra(EditableDataActivity.IntentKey.PRIMARY_KEY.keyName, uniqueIdentifier) + activity?.setResult(RESULT_OK, intent) + */ + activity?.finish() + } + + /** + * Set fragment data + */ + fun setData(dataType: Int, primaryKey: String?) { + /* + this.dataType = dataType + this.liveDataType = LiveData.values()[dataType] + this.primaryKey = primaryKey + */ + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 2a82aee7..b828c444 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -41,6 +41,7 @@ enum class RowViewType(private var layoutRes: Int) { INFO(R.layout.row_info), // Row + CLASSIC_HEADER_TITLE(R.layout.row_header_title), TITLE(R.layout.row_title), TITLE_ARROW(R.layout.row_title_arrow), TITLE_VALUE(R.layout.row_title_value), @@ -75,7 +76,7 @@ enum class RowViewType(private var layoutRes: Int) { HEADER_TITLE, HEADER_TITLE_VALUE, HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT_BIG, LOCATION_TITLE, INFO -> CustomizableRowViewHolder(layout) // Row View Holder - TITLE, TITLE_ARROW, TITLE_VALUE, TITLE_VALUE_ARROW, TITLE_GRID, TITLE_SWITCH, TITLE_CHECK, DATA, BOTTOM_SHEET_DATA, LOADER -> RowViewHolder( + CLASSIC_HEADER_TITLE, TITLE, TITLE_ARROW, TITLE_VALUE, TITLE_VALUE_ARROW, TITLE_GRID, TITLE_SWITCH, TITLE_CHECK, DATA, BOTTOM_SHEET_DATA, LOADER -> RowViewHolder( layout ) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt new file mode 100644 index 00000000..af5d5f88 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterCategoryRow.kt @@ -0,0 +1,91 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + +enum class FilterCategoryRow : RowRepresentable { + + GENERAL, + DATE, + DURATION, + SESSION, + CASH, + TOURNAMENT, + ONLINE, + RESULT, + TRANSACTION_TYPES, + + // Title Custom fields + LOCATION, + BANKROLL, + PLAYERS; + + override val resId: Int? + get() { + return when (this) { + GENERAL -> R.string.general + DATE -> R.string.date + DURATION -> R.string.duration + SESSION -> R.string.session + CASH -> R.string.cash + TOURNAMENT -> R.string.tournament + ONLINE -> R.string.online + RESULT -> R.string.result + TRANSACTION_TYPES -> R.string.operation_types + LOCATION -> R.string.location + BANKROLL -> R.string.bankroll + PLAYERS -> R.string.players + } + } + + override val viewType: Int + get() { + return when (this) { + GENERAL, DATE, DURATION, SESSION, CASH, TOURNAMENT, ONLINE, RESULT, TRANSACTION_TYPES, + LOCATION, BANKROLL, PLAYERS -> RowViewType.TITLE_VALUE_ARROW.ordinal + } + } + + /** + * Get subcategories of filters + */ + fun getSubcategories(): ArrayList { + val subcategories = ArrayList() + + when (this) { + GENERAL -> subcategories.addAll( + arrayListOf( + FilterSubcategoryRow.CASH_TOURNAMENT, FilterSubcategoryRow.LIVE_ONLINE, FilterSubcategoryRow.GAME, + FilterSubcategoryRow.LIMIT_TYPE, FilterSubcategoryRow.TABLE_SIZE + ) + ) + DATE -> subcategories.addAll( + arrayListOf( + FilterSubcategoryRow.DYNAMIC_DATE, FilterSubcategoryRow.FIXED_DATE, FilterSubcategoryRow.DURATION, FilterSubcategoryRow.YEAR, + FilterSubcategoryRow.WEEKDAYS_OR_WEEKEND, FilterSubcategoryRow.DAY_OF_WEEK, FilterSubcategoryRow.MONTH_OF_YEAR + ) + ) + DURATION -> subcategories.addAll(arrayListOf(FilterSubcategoryRow.SESSION_DURATION, FilterSubcategoryRow.RANGE)) + SESSION -> subcategories.addAll(arrayListOf()) + CASH -> subcategories.addAll(arrayListOf(FilterSubcategoryRow.BLINDS, FilterSubcategoryRow.CASH_RE_BUY_COUNT)) + TOURNAMENT -> subcategories.addAll( + arrayListOf( + FilterSubcategoryRow.TOURNAMENT_TYPE, FilterSubcategoryRow.COMPLETION_PERCENTAGE, FilterSubcategoryRow.PLACE, + FilterSubcategoryRow.PLAYERS_COUNT, FilterSubcategoryRow.TOURNAMENT_RE_BUY_COUNT, FilterSubcategoryRow.BUY_IN + ) + ) + ONLINE -> subcategories.addAll(arrayListOf(FilterSubcategoryRow.MULTI_TABLING)) + RESULT -> subcategories.addAll(arrayListOf(FilterSubcategoryRow.VALUE)) + TRANSACTION_TYPES -> subcategories.addAll(arrayListOf()) + LOCATION -> subcategories.addAll(arrayListOf(FilterSubcategoryRow.LOCATION)) + BANKROLL -> subcategories.addAll(arrayListOf(FilterSubcategoryRow.BANKROLL)) + PLAYERS -> subcategories.addAll(arrayListOf(FilterSubcategoryRow.NUMBER_OF_PLAYERS, FilterSubcategoryRow.MULTI_PLAYER)) + + } + + return subcategories + } + + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt deleted file mode 100644 index 0b5f2b7a..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt +++ /dev/null @@ -1,50 +0,0 @@ -package net.pokeranalytics.android.ui.view.rowrepresentable - -import net.pokeranalytics.android.R -import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowViewType - -enum class FilterRow : RowRepresentable { - - GENERAL, - DATE, - DURATION, - SESSION, - CASH, - TOURNAMENT, - ONLINE, - RESULT, - TRANSACTION_TYPES, - - // Title Custom fields - LOCATION, - BANKROLL, - PLAYERS; - - override val resId: Int? - get() { - return when (this) { - GENERAL -> R.string.general - DATE -> R.string.date - DURATION -> R.string.duration - SESSION -> R.string.session - CASH -> R.string.cash - TOURNAMENT -> R.string.tournament - ONLINE -> R.string.online - RESULT -> R.string.result - TRANSACTION_TYPES -> R.string.operation_types - LOCATION -> R.string.location - BANKROLL -> R.string.bankroll - PLAYERS -> R.string.players - } - } - - override val viewType: Int - get() { - return when (this) { - GENERAL, DATE, DURATION, SESSION, CASH, TOURNAMENT, ONLINE, RESULT, TRANSACTION_TYPES, - LOCATION, BANKROLL, PLAYERS -> RowViewType.TITLE_VALUE_ARROW.ordinal - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSubcategoryRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSubcategoryRow.kt new file mode 100644 index 00000000..bc4e4aa9 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSubcategoryRow.kt @@ -0,0 +1,113 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + +enum class FilterSubcategoryRow : RowRepresentable { + + // General + CASH_TOURNAMENT, + LIVE_ONLINE, + GAME, + LIMIT_TYPE, + TABLE_SIZE, + + // Date + DYNAMIC_DATE, + FIXED_DATE, + DURATION, + YEAR, + WEEKDAYS_OR_WEEKEND, + DAY_OF_WEEK, + MONTH_OF_YEAR, + + // Duration + SESSION_DURATION, + RANGE, + + // Sessions + // - + + // Cash + BLINDS, + CASH_RE_BUY_COUNT, + + // Tournament + TOURNAMENT_TYPE, + COMPLETION_PERCENTAGE, + PLACE, + PLAYERS_COUNT, + TOURNAMENT_RE_BUY_COUNT, + BUY_IN, + + // Online + MULTI_TABLING, + + // Result + VALUE, + + // Transaction types + // - + + // Location + LOCATION, + + // Bankroll + BANKROLL, + + // Players + NUMBER_OF_PLAYERS, + MULTI_PLAYER; + + override val resId: Int? + get() { + return when(this) { + CASH_TOURNAMENT -> R.string.cash_or_tournament + LIVE_ONLINE -> R.string.live_or_online + GAME -> R.string.game + LIMIT_TYPE -> R.string.type_de_limite + TABLE_SIZE -> R.string.table_size + + DYNAMIC_DATE -> R.string.dynamic_date + FIXED_DATE -> R.string.fixed_date + DURATION -> R.string.duration + YEAR -> R.string.year + WEEKDAYS_OR_WEEKEND -> R.string.weekdays_or_weekend + DAY_OF_WEEK -> R.string.day_of_the_week + MONTH_OF_YEAR -> R.string.month_of_the_year + + SESSION_DURATION -> R.string.session_duration + RANGE -> R.string.hour_slot + + BLINDS -> R.string.blinds + CASH_RE_BUY_COUNT -> R.string.rebuy_count + + TOURNAMENT_TYPE -> R.string.tournament_type + COMPLETION_PERCENTAGE -> R.string.tournament_completion_percentage_interval + PLACE -> R.string.place + PLAYERS_COUNT -> R.string.players_count + TOURNAMENT_RE_BUY_COUNT -> R.string.rebuy_count + BUY_IN -> R.string.buyin + + MULTI_TABLING -> R.string.multi_tabling + + VALUE -> R.string.value + + LOCATION -> R.string.location + + BANKROLL -> R.string.bankroll + + NUMBER_OF_PLAYERS -> R.string.number_of_players + MULTI_PLAYER -> R.string.multiplayer + } + } + + override val viewType: Int = RowViewType.CLASSIC_HEADER_TITLE.ordinal + + fun getFilterRow() : ArrayList { + val rows = ArrayList() + return rows + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_filter.xml b/app/src/main/res/layout/activity_filter_details.xml similarity index 100% rename from app/src/main/res/layout/activity_filter.xml rename to app/src/main/res/layout/activity_filter_details.xml diff --git a/app/src/main/res/layout/activity_filters.xml b/app/src/main/res/layout/activity_filters.xml new file mode 100644 index 00000000..70454fb9 --- /dev/null +++ b/app/src/main/res/layout/activity_filters.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_filter.xml b/app/src/main/res/layout/fragment_filter_details.xml similarity index 100% rename from app/src/main/res/layout/fragment_filter.xml rename to app/src/main/res/layout/fragment_filter_details.xml diff --git a/app/src/main/res/layout/fragment_filters.xml b/app/src/main/res/layout/fragment_filters.xml new file mode 100644 index 00000000..bab049a9 --- /dev/null +++ b/app/src/main/res/layout/fragment_filters.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 940666adb909d059491f6dc96003c9a2c4d719f3 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 19 Mar 2019 15:15:40 +0100 Subject: [PATCH 2/3] Improve filters / wip --- .../ui/fragment/FilterDetailsFragment.kt | 68 +++++++++---------- .../ui/view/rowrepresentable/FilterRow.kt | 27 ++++++++ .../rowrepresentable/FilterSubcategoryRow.kt | 35 +++++++++- 3 files changed, 92 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index 95349e78..87688c66 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -9,15 +9,16 @@ import kotlinx.android.synthetic.main.fragment_filter_details.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter +import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate -import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import timber.log.Timber -open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { +open class FilterDetailsFragment : PokerAnalyticsFragment(), RowRepresentableDataSource, RowRepresentableDelegate { lateinit var parentActivity: PokerAnalyticsActivity lateinit var item: RealmObject @@ -59,10 +60,7 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta return true } - override fun adapterRows(): List? { - return rows - } - + /* override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { super.onRowSelected(position, row, fromAction) } @@ -70,6 +68,29 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta override fun onRowValueChanged(value: Any?, row: RowRepresentable) { super.onRowValueChanged(value, row) } + */ + + override fun adapterRows(): List? { + return rows + } + + override fun rowRepresentableForPosition(position: Int): RowRepresentable? { + return rows[position] + } + + override fun numberOfRows(): Int { + return rows.size + } + + override fun viewTypeForPosition(position: Int): Int { + val rowViewType = rowRepresentableForPosition(position)?.viewType ?: -1 + return if (rowViewType != -1) rowViewType else RowViewType.TITLE_CHECK.ordinal + } + + override fun indexForRow(row: RowRepresentable): Int { + return rows.indexOf(row) + } + /** * Init UI @@ -102,40 +123,15 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta this.appBar.toolbar.title = it.localizedTitle(requireContext()) this.rows.clear() - this.rows.addAll(it.getSubcategories()) - Timber.d("initData: ${this.rows.size}") + for (subcategory in it.getSubcategories()) { + this.rows.add(subcategory) + this.rows.addAll(subcategory.getFilterRows(getRealm())) + } this.rowRepresentableAdapter = RowRepresentableAdapter(this, this) this.recyclerView.adapter = rowRepresentableAdapter - } - /* - if (this.dataType != null) { - val proxyItem: RealmObject? = this.liveDataType.getData(this.getRealm(), primaryKey) - proxyItem?.let { - //TODO: Localize - this.appBar.toolbar.title = "Update ${this.liveDataType.localizedTitle(this.parentActivity).toLowerCase().capitalize()}" - isUpdating = true - } ?: run { - //TODO: Localize - this.appBar.toolbar.title = this.liveDataType.newEntityLocalizedTitle(requireContext()) - } - this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) - - val dataSource = getDataSource() - this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) - this.recyclerView.adapter = rowRepresentableAdapter - - // When creating an object, open automatically the keyboard for the first row - if (!isUpdating && shouldOpenKeyboard) { - val row = dataSource.adapterRows()?.firstOrNull() - row?.let { - onRowSelected(0, it) - } - } - } - */ } /** @@ -211,8 +207,6 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresenta */ fun setData(filterCategory: Int) { - Timber.d("Filter Category: ${FilterCategoryRow.values()[filterCategory]}") - Timber.d("Filter Subcategories: ${FilterCategoryRow.values()[filterCategory].getSubcategories()}") this.filterCategory = FilterCategoryRow.values()[filterCategory] /* diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt new file mode 100644 index 00000000..67ee210f --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt @@ -0,0 +1,27 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + +enum class FilterRow : RowRepresentable { + + // General + CASH_GAME, + TOURNAMENT, + LIVE, + ONLINE; + + override val resId: Int? + get() { + return when (this) { + CASH_GAME -> R.string.cash_game + TOURNAMENT -> R.string.tournament + LIVE -> R.string.live + ONLINE -> R.string.online + } + } + + override val viewType: Int = RowViewType.TITLE_CHECK.ordinal + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSubcategoryRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSubcategoryRow.kt index bc4e4aa9..a9a30dbc 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSubcategoryRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterSubcategoryRow.kt @@ -1,6 +1,11 @@ package net.pokeranalytics.android.ui.view.rowrepresentable +import io.realm.Realm +import io.realm.RealmResults import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.Limit +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.realm.Game import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType @@ -60,6 +65,11 @@ enum class FilterSubcategoryRow : RowRepresentable { NUMBER_OF_PLAYERS, MULTI_PLAYER; + enum class Type { + SINGLE, + MULTIPLE, + } + override val resId: Int? get() { return when(this) { @@ -105,8 +115,31 @@ enum class FilterSubcategoryRow : RowRepresentable { override val viewType: Int = RowViewType.CLASSIC_HEADER_TITLE.ordinal - fun getFilterRow() : ArrayList { + /** + * Return the type of the selection + */ + fun getType() : Type { + return when(this) { + GAME -> Type.MULTIPLE + else -> Type.SINGLE + } + } + + /** + * Returns the filter rows + */ + fun getFilterRows(realm: Realm) : ArrayList { val rows = ArrayList() + when(this) { + CASH_TOURNAMENT -> rows.addAll(arrayListOf(FilterRow.CASH_GAME, FilterRow.TOURNAMENT)) + LIVE_ONLINE -> rows.addAll(arrayListOf(FilterRow.LIVE, FilterRow.ONLINE)) + GAME -> { + val games = realm.copyFromRealm(LiveData.GAME.items(realm) as RealmResults) + rows.addAll(games) + } + LIMIT_TYPE -> rows.addAll(Limit.values()) + else -> rows.addAll(arrayListOf()) + } return rows } From 47c76e18c1170d6fb1bfb38459c0879b03dfa18c Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 19 Mar 2019 15:34:47 +0100 Subject: [PATCH 3/3] Add single/multiple row selection --- .../ui/fragment/FilterDetailsFragment.kt | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt index 87688c66..a6b90282 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDetailsFragment.kt @@ -15,6 +15,7 @@ import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow +import net.pokeranalytics.android.ui.view.rowrepresentable.FilterSubcategoryRow import timber.log.Timber @@ -60,15 +61,40 @@ open class FilterDetailsFragment : PokerAnalyticsFragment(), RowRepresentableDat return true } - /* override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { super.onRowSelected(position, row, fromAction) + + + filterCategory?.let { + for (subcategory in it.getSubcategories()) { + if (subcategory.getFilterRows(getRealm()).contains(row)) { + if (subcategory.getType() == FilterSubcategoryRow.Type.SINGLE) { + for (filterRow in subcategory.getFilterRows(getRealm())) { + selectedRows.remove(filterRow) + } + } + } + } + } + + if (selectedRows.contains(row)) { + selectedRows.remove(row) + } else { + selectedRows.add(row) + } + + rowRepresentableAdapter.notifyDataSetChanged() + } + + val selectedRows = ArrayList() + + override fun isSelected(row: RowRepresentable): Boolean { + return selectedRows.contains(row) } override fun onRowValueChanged(value: Any?, row: RowRepresentable) { super.onRowValueChanged(value, row) } - */ override fun adapterRows(): List? { return rows