From c2216ddf628d966a7bbe86f4519cc7e55fb05d6c Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 19 Mar 2019 10:56:44 +0100 Subject: [PATCH 1/3] Clean code --- .../android/ui/view/rowrepresentable/SessionRow.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt index 094f9bd6..c3aca78c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt @@ -6,7 +6,6 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState -import net.pokeranalytics.android.model.realm.Game import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.view.RowRepresentable @@ -277,8 +276,6 @@ enum class SessionRow : RowRepresentable { } else -> null } - - - } + } \ No newline at end of file From 68c855e8253672eb8625d1bc79865eda817b3682 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 19 Mar 2019 10:57:03 +0100 Subject: [PATCH 2/3] Improve style --- app/src/main/res/values/styles.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8a13e62f..b9faf4be 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -185,7 +185,7 @@ From be4c4bd306a6fd1490446b8c1f9282ce0f3d5402 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 19 Mar 2019 10:57:15 +0100 Subject: [PATCH 3/3] Add filter (work in progress) --- app/src/main/AndroidManifest.xml | 5 +- .../android/ui/activity/FilterActivity.kt | 59 +++++ .../android/ui/activity/HomeActivity.kt | 82 ++++++- .../android/ui/fragment/FilterDataFragment.kt | 210 ++++++++++++++++++ .../ui/view/rowrepresentable/FilterRow.kt | 50 +++++ app/src/main/res/layout/activity_filter.xml | 7 + app/src/main/res/layout/fragment_filter.xml | 61 +++++ app/src/main/res/menu/home_menu.xml | 11 + 8 files changed, 477 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/activity/FilterActivity.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDataFragment.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt create mode 100644 app/src/main/res/layout/activity_filter.xml create mode 100644 app/src/main/res/layout/fragment_filter.xml create mode 100644 app/src/main/res/menu/home_menu.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a7bce528..e581fdd5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,9 +42,12 @@ android:launchMode="singleTop" /> + when (item.itemId) { net.pokeranalytics.android.R.id.navigation_history -> { @@ -48,10 +53,26 @@ class HomeActivity : PokerAnalyticsActivity() { checkFirstLaunch() } + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.home_menu, menu) + this.homeMenu = menu + return super.onCreateOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item?.itemId) { + R.id.filter -> manageFilters() + } + return super.onOptionsItemSelected(item) + } + /** * Init UI */ private fun initUI() { + + setSupportActionBar(toolbar) + navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener) navigation.selectedItemId = net.pokeranalytics.android.R.id.navigation_history @@ -80,16 +101,63 @@ class HomeActivity : PokerAnalyticsActivity() { * Display a new fragment */ private fun displayFragment(index: Int) { + viewPager.setCurrentItem(index, false) + updateToolbar(index) + } - toolbar.title = when (index) { - 0 -> getString(R.string.title_history) - 1 -> getString(R.string.title_stats) - 2 -> getString(R.string.title_settings) - else -> "" + /** + * Update toolbar + */ + private fun updateToolbar(index: Int) { + when (index) { + 0 -> { + toolbar.title = getString(R.string.title_history) + homeMenu?.findItem(R.id.filter)?.isVisible = true + } + 1 -> { + toolbar.title = getString(R.string.title_stats) + homeMenu?.findItem(R.id.filter)?.isVisible = false + } + 2 -> { + toolbar.title = getString(R.string.title_settings) + homeMenu?.findItem(R.id.filter)?.isVisible = false + } } - - viewPager.setCurrentItem(index, false) } + /** + * Manage filters + */ + private fun manageFilters() { + + val filterSelected = false + + val choices = ArrayList() + choices.add(getString(R.string.new_str)) + + if (filterSelected) { + choices.add(getString(R.string.modify_current_filter)) + choices.add(getString(R.string.load_from_db)) + choices.add(getString(R.string.remove_filter)) + } + + val builder = AlertDialog.Builder(this) + builder.setTitle(R.string.filter_selection) + .setCancelable(true) + .setItems(choices.toTypedArray()) { _, which -> + Timber.d("Click on $which") + + when(which) { + 0 -> FilterActivity.newInstance(this@HomeActivity) + } + + } + .setNegativeButton(R.string.cancel) {dialog, which -> + Timber.d("Click on cancel") + } + + builder.show() + + } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDataFragment.kt new file mode 100644 index 00000000..cc530abe --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FilterDataFragment.kt @@ -0,0 +1,210 @@ +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_filter.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.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 + + +open class FilterDataFragment : 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_filter, 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) + } + + 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(FilterRow.values()) + + 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) + } + } + } + */ + } + + /** + * 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/rowrepresentable/FilterRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt new file mode 100644 index 00000000..0b5f2b7a --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/FilterRow.kt @@ -0,0 +1,50 @@ +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/res/layout/activity_filter.xml b/app/src/main/res/layout/activity_filter.xml new file mode 100644 index 00000000..70454fb9 --- /dev/null +++ b/app/src/main/res/layout/activity_filter.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.xml new file mode 100644 index 00000000..bab049a9 --- /dev/null +++ b/app/src/main/res/layout/fragment_filter.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/home_menu.xml b/app/src/main/res/menu/home_menu.xml new file mode 100644 index 00000000..38cbd892 --- /dev/null +++ b/app/src/main/res/menu/home_menu.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file