From 1c8ff102c68a6ca7174560e22bc0b95c9c436c5a Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 10:33:33 +0200 Subject: [PATCH 01/12] Clean code --- .../ui/fragment/FilterDetailsFragment.kt | 1 - .../android/ui/fragment/FiltersFragment.kt | 22 ++++++------------- .../fragment/components/FilterableFragment.kt | 10 +++------ 3 files changed, 10 insertions(+), 23 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 e752e1eb..7fe858e8 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 @@ -55,7 +55,6 @@ open class FilterDetailsFragment : RealmFragment(), StaticRowRepresentableDataSo override fun onBackPressed() { super.onBackPressed() - println("<<<<< back pressed") saveData() } 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 index c1cfe849..ad66cd84 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt @@ -27,13 +27,13 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.extensions.sorted -import timber.log.Timber open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { companion object { const val REQUEST_CODE_FILTER_DETAILS = 100 + const val MOST_USED_FILTERS_DISPLAYED = 6 var currentFilter: Filter? = null @@ -196,19 +196,19 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, */ private fun updateMostUsedFilters() { - if (isUpdating) { + var nbChips = 0 + val filters = getRealm().sorted(Filter::class.java) + val currentFilterId = Preferences.getActiveFilterId(requireContext()) + + if (isUpdating || filters.isEmpty() || (filters.size == 1 && filters.first()?.id == currentFilterId)) { mostUsedFiltersLayout.visibility = View.GONE return } - val filters = getRealm().sorted(Filter::class.java) - val currentFilterId = Preferences.getActiveFilterId(requireContext()) - mostUsedFilters.removeAllViews() - var nbChips = 0 filters.forEach { filter -> - if (nbChips < 3) { + if (nbChips < MOST_USED_FILTERS_DISPLAYED) { if (filter.id != currentFilterId) { val chip = Chip(requireContext()) @@ -220,7 +220,6 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, chip.isChecked = filter.id == currentFilterId chip.setOnCloseIconClickListener { - chip.isChecked = false } chip.setOnClickListener { @@ -235,7 +234,6 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, } } } - } /** @@ -250,13 +248,10 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, * Validate the updates of the queryWith */ private fun validateUpdates() { - Timber.d("Validate queryWith updates") - val realm = getRealm() realm.beginTransaction() currentFilter?.let { it.name = it.query.getName(requireContext()) - Timber.d("name: ${it.name}") realm.copyToRealmOrUpdate(it) } realm.commitTransaction() @@ -269,10 +264,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, * Cancel the latest updates of the queryWith */ private fun cancelUpdates() { - Timber.d("Cancel queryWith updates") - val filterId = filterCopy?.id ?: "" - val realm = getRealm() realm.beginTransaction() filterCopy?.let { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/FilterableFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/FilterableFragment.kt index 40987b84..8a3d3eee 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/FilterableFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/FilterableFragment.kt @@ -22,9 +22,9 @@ import timber.log.Timber /** * A class which define the fragment as Filterable - * - Add an filter icon menu - * - Access to the filters actions (new, select, modify, remove) - * - ... + * - Add a filter icon menu + * - Listen for INTENT_FILTER_UPDATE_FILTER_UI + * - */ open class FilterableFragment : RealmFragment(), FilterHandler { @@ -46,13 +46,11 @@ open class FilterableFragment : RealmFragment(), FilterHandler { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - Timber.d("onActivityCreated: $parentActivity") parentActivity?.registerReceiver(updateFilterUIBroadcast, IntentFilter(INTENT_FILTER_UPDATE_FILTER_UI)) } override fun onDestroy() { super.onDestroy() - Timber.d("onDestroy: $parentActivity") parentActivity?.unregisterReceiver(updateFilterUIBroadcast) } @@ -84,12 +82,10 @@ open class FilterableFragment : RealmFragment(), FilterHandler { } override fun applyFilter() { - Timber.d("applyFilter") updateFilterUI() } override fun removeFilter() { - Timber.d("removeFilter") hideSelectedFilter() } From 85a38071be496dd5201fe01b5fc59077695473bb Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 11:22:51 +0200 Subject: [PATCH 02/12] Improve filters list --- .../android/model/realm/Filter.kt | 159 ++++++++++-------- .../android/ui/activity/DataListActivity.kt | 29 ++-- .../android/ui/extensions/UIExtensions.kt | 6 + .../android/ui/fragment/DataListFragment.kt | 54 ++++-- .../android/ui/fragment/FiltersFragment.kt | 2 +- .../android/ui/view/RowRepresentable.kt | 10 +- .../android/ui/view/RowViewType.kt | 9 + .../res/layout/row_title_value_action.xml | 8 +- 8 files changed, 162 insertions(+), 115 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index df148089..a7576a40 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -12,7 +12,9 @@ import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.ui.interfaces.FilterableType +import net.pokeranalytics.android.ui.view.ImageDecorator import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import java.util.* @@ -21,14 +23,14 @@ import java.util.* * It contains a list of [FilterCondition] describing the complete query to launch * The [Filter] is working closely with a [Filterable] interface providing the entity we want the query being launched on */ -open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable { +open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, ImageDecorator { companion object { // Create a new instance - fun newInstance(realm: Realm, filterableType:Int): Filter { + fun newInstance(realm: Realm, filterableType: Int): Filter { val filter = Filter() - filter.filterableTypeOrdinal = filterableType + filter.filterableTypeOrdinal = filterableType return filter //return realm.copyToRealm(filter) } @@ -38,26 +40,26 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable { return realm.where().equalTo("id", filterId).findFirst() } - inline fun queryOn(realm: Realm, query: Query, sortField: String? = null): RealmResults { - val realmQuery = realm.where() - sortField?.let { - return query.queryWith(realmQuery).sort(it).findAll() - } ?: run { - return query.queryWith(realmQuery).findAll() - } - } + inline fun queryOn(realm: Realm, query: Query, sortField: String? = null): RealmResults { + val realmQuery = realm.where() + sortField?.let { + return query.queryWith(realmQuery).sort(it).findAll() + } ?: run { + return query.queryWith(realmQuery).findAll() + } + } fun sortedByUsage(realm: Realm): RealmResults { return realm.where(Filter::class.java).findAll().sort("usageCount") } - } + } @PrimaryKey - override var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // the queryWith name - var name: String = "" + var name: String = "" // the number of use of the queryWith, // for MutableRealmInteger, see https://realm.io/docs/java/latest/#counters @@ -66,106 +68,115 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable { var filterConditions: RealmList = RealmList() private set - private var filterableTypeOrdinal: Int? = null - - val filterableType: FilterableType - get() { - this.filterableTypeOrdinal?.let { - return FilterableType.values()[it] - } - return FilterableType.ALL - } + private var filterableTypeOrdinal: Int? = null + + override val viewType: Int + get() = RowViewType.TITLE_VALUE_ACTION.ordinal + override val imageRes: Int? + get() = R.drawable.ic_outline_settings + override val imageTint: Int? + get() = R.color.green + override val imageClickable: Boolean? + get() = true + + val filterableType: FilterableType + get() { + this.filterableTypeOrdinal?.let { + return FilterableType.values()[it] + } + return FilterableType.ALL + } fun createOrUpdateFilterConditions(filterConditionRows: ArrayList) { - println("list of querys saving: ${filterConditionRows.map { it.id }}") - println("list of querys previous: ${this.filterConditions.map { it.queryCondition.id }}") - filterConditionRows + println("list of querys saving: ${filterConditionRows.map { it.id }}") + println("list of querys previous: ${this.filterConditions.map { it.queryCondition.id }}") + filterConditionRows .map { it.groupId } .distinct() - .forEach { groupId-> + .forEach { groupId -> filterConditionRows .filter { it.groupId == groupId } .apply { - println("list of querys: ${this.map { it.id }}") - val casted = arrayListOf() - casted.addAll(this) - val newFilterCondition = FilterCondition(casted) - val previousCondition = filterConditions.filter { - it.filterName == newFilterCondition.filterName && it.operator == newFilterCondition.operator - } - filterConditions.removeAll(previousCondition) - filterConditions.add(newFilterCondition) - } + println("list of querys: ${this.map { it.id }}") + val casted = arrayListOf() + casted.addAll(this) + val newFilterCondition = FilterCondition(casted) + val previousCondition = filterConditions.filter { + it.filterName == newFilterCondition.filterName && it.operator == newFilterCondition.operator + } + filterConditions.removeAll(previousCondition) + filterConditions.add(newFilterCondition) + } } } - fun remove(filterCategoryRow: FilterCategoryRow) { - val sections = filterCategoryRow.filterSectionRows.map { it.name } - val savedSections = filterConditions.filter { sections.contains(it.sectionName) } - this.filterConditions.removeAll(savedSections) - } + fun remove(filterCategoryRow: FilterCategoryRow) { + val sections = filterCategoryRow.filterSectionRows.map { it.name } + val savedSections = filterConditions.filter { sections.contains(it.sectionName) } + this.filterConditions.removeAll(savedSections) + } fun countBy(filterCategoryRow: FilterCategoryRow): Int { val sections = filterCategoryRow.filterSectionRows.map { it.name } - println("list of sections $sections") - val savedSections = filterConditions.filter { sections.contains(it.sectionName) }.flatMap { it.queryCondition.id } - println("list of savedSections $savedSections") - return savedSections.size + println("list of sections $sections") + val savedSections = filterConditions.filter { sections.contains(it.sectionName) }.flatMap { it.queryCondition.id } + println("list of savedSections $savedSections") + return savedSections.size } fun contains(filterElementRow: QueryCondition): Boolean { - println("list of saved queries ${filterConditions.map { it.queryCondition.id }}") - println("list of contains ${filterElementRow.id}") - val contained = filterConditions.flatMap{ it.queryCondition.id }.contains(filterElementRow.id.first()) - println("list of : $contained") - return contained + println("list of saved queries ${filterConditions.map { it.queryCondition.id }}") + println("list of contains ${filterElementRow.id}") + val contained = filterConditions.flatMap { it.queryCondition.id }.contains(filterElementRow.id.first()) + println("list of : $contained") + return contained } /** * Get the saved value for the given [filterElementRow] */ - fun loadValueForElement(filterElementRow: QueryCondition) { + fun loadValueForElement(filterElementRow: QueryCondition) { val filtered = filterConditions.filter { it.queryCondition.id == filterElementRow.id } if (filtered.isNotEmpty()) { - return filterElementRow.updateValueBy(filtered.first()) + return filterElementRow.updateValueBy(filtered.first()) } } inline fun results(firstField: String? = null, secondField: String? = null): RealmResults { - val realmQuery = realm.where() + val realmQuery = realm.where() - if (firstField != null && secondField != null) { - return this.query.queryWith(realmQuery).distinct(firstField, secondField).findAll() - } + if (firstField != null && secondField != null) { + return this.query.queryWith(realmQuery).distinct(firstField, secondField).findAll() + } - if (firstField != null) { - return this.query.queryWith(realmQuery).distinct(firstField).findAll() - } + if (firstField != null) { + return this.query.queryWith(realmQuery).distinct(firstField).findAll() + } - return this.query.queryWith(realmQuery).findAll() - } + return this.query.queryWith(realmQuery).findAll() + } - val query: Query - get() { - val query = Query() - this.filterConditions.forEach { - query.add(it.queryCondition) - } - return query - } + val query: Query + get() { + val query = Query() + this.filterConditions.forEach { + query.add(it.queryCondition) + } + return query + } - override fun getDisplayName(context: Context): String { - if (name.isNotEmpty()) return name - return this.query.getName(context) - } + override fun getDisplayName(context: Context): String { + if (name.isNotEmpty()) return name + return this.query.getName(context) + } override fun isValidForDelete(realm: Realm): Boolean { return true 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 11b92ce6..846a901b 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 @@ -14,8 +14,9 @@ class DataListActivity : PokerAnalyticsActivity() { enum class IntentKey(val keyName: String) { DATA_TYPE("DATA_TYPE"), - LIVE_DATA_TYPE("LIVE_DATA_TYPE"), - ITEM_DELETED("ITEM_DELETED") + LIVE_DATA_TYPE("LIVE_DATA_TYPE"), + ITEM_DELETED("ITEM_DELETED"), + SHOW_ADD_BUTTON("SHOW_ADD_BUTTON"), } companion object { @@ -23,17 +24,18 @@ class DataListActivity : PokerAnalyticsActivity() { context.startActivity(getIntent(context, dataType)) } - fun newSelectInstance(fragment: Fragment, dataType: Int) { - val context = fragment.requireContext() - fragment.startActivityForResult(getIntent(context, dataType), FilterActivityRequestCode.SELECT_FILTER.ordinal) - } + fun newSelectInstance(fragment: Fragment, dataType: Int, showAddButton: Boolean = true) { + val context = fragment.requireContext() + fragment.startActivityForResult(getIntent(context, dataType, showAddButton), FilterActivityRequestCode.SELECT_FILTER.ordinal) + } - private fun getIntent(context:Context, dataType:Int) : Intent { - val intent = Intent(context, DataListActivity::class.java) - intent.putExtra(IntentKey.DATA_TYPE.keyName, dataType) - return intent - } - } + private fun getIntent(context: Context, dataType: Int, showAddButton: Boolean = true): Intent { + val intent = Intent(context, DataListActivity::class.java) + intent.putExtra(IntentKey.DATA_TYPE.keyName, dataType) + intent.putExtra(IntentKey.SHOW_ADD_BUTTON.keyName, showAddButton) + return intent + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -46,10 +48,11 @@ class DataListActivity : PokerAnalyticsActivity() { * Init UI */ 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) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt index ce769da5..2b1ff140 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.Intent import android.content.res.Resources import android.net.Uri +import android.util.TypedValue import android.view.View import android.widget.Toast import androidx.appcompat.app.AlertDialog @@ -149,4 +150,9 @@ fun View.showWithAnimation() { isVisible = true animate().cancel() animate().alpha(1f).start() +} + +fun View.addCircleRipple() = with(TypedValue()) { + context.theme.resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, this, true) + setBackgroundResource(resourceId) } \ No newline at end of file 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 ac4d5f01..dfa4a081 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 @@ -19,6 +19,7 @@ import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate +import net.pokeranalytics.android.ui.extensions.toast import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback import net.pokeranalytics.android.ui.view.RowRepresentable @@ -41,20 +42,6 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource return this.items } - /** - * Set fragment data - */ - fun setData(dataType: Int) { - - this.dataType = LiveData.values()[dataType] - this.identifiableClass = this.dataType.relatedEntity - setToolbarTitle(this.dataType.localizedTitle(requireContext())) - - val realm = getRealm() - this.items = realm.sorted(this.identifiableClass) - - } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater.inflate(R.layout.fragment_data_list, container, false) @@ -124,10 +111,16 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource 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() + if (fromAction) { + // Open filter params + toast("Hey") + } else { + // Select 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 @@ -136,4 +129,29 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource } } + /** + * Set fragment data + */ + fun setData(dataType: Int) { + + this.dataType = LiveData.values()[dataType] + this.identifiableClass = this.dataType.relatedEntity + setToolbarTitle(this.dataType.localizedTitle(requireContext())) + + val realm = getRealm() + this.items = realm.sorted(this.identifiableClass) + + } + + /** + * Update UI + */ + fun updateUI(showAddButton: Boolean) { + if (showAddButton) { + this.addButton.show() + } else { + this.addButton.hide() + } + } + } \ No newline at end of file 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 index ad66cd84..7bed87d8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt @@ -156,7 +156,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource, } moreFilters.setOnClickListener { - DataListActivity.newSelectInstance(this, LiveData.FILTER.ordinal) + DataListActivity.newSelectInstance(this, LiveData.FILTER.ordinal, false) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index 15212620..1f6ce50f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -34,15 +34,13 @@ interface DefaultEditDataSource : EditDataSource, Localizable { interface ImageDecorator { val imageRes: Int? - get() { - return null - } + get() = null val imageTint: Int? - get() { - return null - } + get() = null + val imageClickable: Boolean? + get() = false } /** 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 efa3a5c2..ed8dfffd 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 @@ -31,6 +31,7 @@ import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.extensions.ChipGroupExtension +import net.pokeranalytics.android.ui.extensions.addCircleRipple import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.ui.graph.AxisFormatting @@ -204,6 +205,14 @@ enum class RowViewType(private var layoutRes: Int) { row.imageTint?.let { color -> imageView.setColorFilter(ContextCompat.getColor(imageView.context, color)) } + if (row.imageClickable == true) { + imageView.addCircleRipple() + imageView.setOnClickListener { + adapter.delegate?.onRowSelected(position, row, true) + } + } else { + imageView.setBackgroundResource(0) + } } // Listener diff --git a/app/src/main/res/layout/row_title_value_action.xml b/app/src/main/res/layout/row_title_value_action.xml index b0e98b29..2b3e7f62 100644 --- a/app/src/main/res/layout/row_title_value_action.xml +++ b/app/src/main/res/layout/row_title_value_action.xml @@ -25,6 +25,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" + android:layout_marginEnd="8dp" android:ellipsize="end" android:gravity="end|center_vertical" android:maxLines="1" @@ -39,14 +40,15 @@ android:id="@+id/action" android:layout_width="32dp" android:layout_height="32dp" - android:layout_marginStart="16dp" + android:background="?selectableItemBackgroundBorderless" android:padding="4dp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@+id/guidelineEnd" app:layout_constraintStart_toEndOf="@+id/value" app:layout_constraintTop_toTopOf="parent" - tools:src="@drawable/ic_close" /> + tools:src="@drawable/ic_close" + tools:visibility="visible" /> + app:layout_constraintGuide_end="8dp" /> \ No newline at end of file From 335029ae0002217305f74e1610a05865bff251e9 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 11:34:12 +0200 Subject: [PATCH 03/12] Add filter edition --- .../pokeranalytics/android/ui/fragment/DataListFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 dfa4a081..8b61eaf6 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 @@ -19,7 +19,6 @@ import net.pokeranalytics.android.ui.activity.FiltersActivity import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate -import net.pokeranalytics.android.ui.extensions.toast import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback import net.pokeranalytics.android.ui.view.RowRepresentable @@ -113,7 +112,8 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource LiveData.FILTER -> { if (fromAction) { // Open filter params - toast("Hey") + val filter = row as Filter + FiltersActivity.newInstanceForResult(fragment = this, filterId = filter.id, currentFilterable = filter.filterableType) } else { // Select filter val intent = Intent() From df1af9db85f654352f0b38891c35081d10eebd32 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 12:02:53 +0200 Subject: [PATCH 04/12] Clean logs --- .../android/ui/fragment/components/DeletableItemFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt index 5ad10ce0..7a777c74 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt @@ -89,8 +89,6 @@ abstract class DeletableItemFragment : RealmFragment() { val deletableItem = (itemToDelete as Deletable) - Timber.d("deletableItem: ${(deletableItem as Filter).getDisplayName(requireContext())}") - // Check if the object is valid for the deletion if (deletableItem.isValidForDelete(this.getRealm())) { deletedItem = getRealm().copyFromRealm(itemToDelete) From 30bca7a06c96b61c3ae5d1e41d4b70549aec9704 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 12:17:32 +0200 Subject: [PATCH 05/12] Update layout for deletion --- .../res/layout/row_title_value_action.xml | 123 ++++++++++-------- 1 file changed, 67 insertions(+), 56 deletions(-) diff --git a/app/src/main/res/layout/row_title_value_action.xml b/app/src/main/res/layout/row_title_value_action.xml index 2b3e7f62..8ca8162d 100644 --- a/app/src/main/res/layout/row_title_value_action.xml +++ b/app/src/main/res/layout/row_title_value_action.xml @@ -1,68 +1,79 @@ - + android:layout_height="48dp"> - + - + - + - + - + + + + + + + + + - \ No newline at end of file From 764d05c57187c936cbc28bf64262724849a63b69 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 12:17:41 +0200 Subject: [PATCH 06/12] Clean TODO --- .../android/ui/adapter/RowRepresentableDataSource.kt | 8 -------- .../android/ui/fragment/DataListFragment.kt | 4 ---- .../android/ui/fragment/ReportCreationFragment.kt | 4 ---- .../components/bottomsheet/BottomSheetListFragment.kt | 7 ------- 4 files changed, 23 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt index f02f7f96..ff8ea00e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt @@ -30,8 +30,6 @@ interface RowRepresentableDataSource: EditableDataSource, DisplayableDataSource, */ fun viewTypeForPosition(position:Int): Int - //TODO should be removed - fun indexForRow(row: RowRepresentable): Int } /** @@ -61,12 +59,6 @@ interface StaticRowRepresentableDataSource: RowRepresentableDataSource { throw IllegalStateException("Need to implement Data Source") } - override fun indexForRow(row: RowRepresentable): Int { - this.adapterRows()?.let { - return it.indexOf(row) - } - throw IllegalStateException("Need to implement Data Source") - } } 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 8b61eaf6..dc8879df 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 @@ -102,10 +102,6 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource return if (viewType != -1) viewType else RowViewType.DATA.ordinal } - override fun indexForRow(row: RowRepresentable): Int { - return this.items.indexOf(row as Identifiable) - } - override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (this.dataType) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt index 11cc28d9..ca06b1fc 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt @@ -120,10 +120,6 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR } } - override fun indexForRow(row: RowRepresentable): Int { - return this.currentRows.indexOf(row) - } - override fun isSelected(row: RowRepresentable): Boolean { return this.assistant.isSelected(row) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt index 6eaee3b8..3595e37d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt @@ -49,13 +49,6 @@ open class BottomSheetListFragment : BottomSheetFragment(), LiveRowRepresentable return RowViewType.BOTTOM_SHEET_DATA.ordinal } - override fun indexForRow(row: RowRepresentable): Int { - realmData?.let { - return it.indexOf(row) - } - throw IllegalStateException("Need to implement Data Source") - } - override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { realmData?.let { val selectedData = it[position] From 3489dca202b8e1829dfe7043e08378ca48af547f Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 12:25:14 +0200 Subject: [PATCH 07/12] Add new strings --- .../pokeranalytics/android/model/LiveData.kt | 19 +++++++++++++------ .../ui/fragment/data/EditableDataFragment.kt | 4 +--- app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt index c4863212..7819c9b0 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -19,9 +19,9 @@ enum class LiveData : Localizable { TOURNAMENT_FEATURE, TRANSACTION, TRANSACTION_TYPE, - FILTER, - CUSTOM_FIELD, - REPORT_SETUP; + FILTER, + CUSTOM_FIELD, + REPORT_SETUP; val relatedEntity: Class get() { @@ -33,7 +33,7 @@ enum class LiveData : Localizable { TOURNAMENT_FEATURE -> TournamentFeature::class.java TRANSACTION -> Transaction::class.java TRANSACTION_TYPE -> TransactionType::class.java - FILTER -> Filter::class.java + FILTER -> Filter::class.java CUSTOM_FIELD -> CustomField::class.java REPORT_SETUP -> ReportSetup::class.java } @@ -48,7 +48,7 @@ enum class LiveData : Localizable { } } - private fun newEntity(): RealmModel{ + private fun newEntity(): RealmModel { return this.relatedEntity.newInstance() } @@ -73,7 +73,7 @@ enum class LiveData : Localizable { TOURNAMENT_FEATURE -> R.string.tournament_feature TRANSACTION -> R.string.operations TRANSACTION_TYPE -> R.string.operation_types - FILTER -> R.string.filter + FILTER -> R.string.filter CUSTOM_FIELD -> R.string.custom_fields REPORT_SETUP -> R.string.custom } @@ -86,4 +86,11 @@ enum class LiveData : Localizable { return "${context.getString(R.string.new_str)} ${this.localizedTitle(context).toLowerCase()}" } + /** + * Return the update entity titleResId + */ + fun updateEntityLocalizedTitle(context: Context): String { + return "${context.getString(R.string.update_entity)} ${this.localizedTitle(context).toLowerCase()}" + } + } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index 7c1a4c72..abe4a9e5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -65,11 +65,9 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat val proxyItem: RealmModel? = this.liveDataType.getData(this.getRealm(), primaryKey) proxyItem?.let { - //TODO: Localize - this.appBar.toolbar.title = "Update ${this.liveDataType.localizedTitle(requireContext()).toLowerCase().capitalize()}" + this.appBar.toolbar.title = this.liveDataType.updateEntityLocalizedTitle(requireContext()) deleteButtonShouldAppear = true } ?: run { - //TODO: Localize this.appBar.toolbar.title = this.liveDataType.newEntityLocalizedTitle(requireContext()) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 294ae6ba..80ab8030 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,6 +31,8 @@ Launch Report Progress Save Report + Update %s + Comparison chart Address Naming suggestions From 988af98d8e69beb4eb116921690a7834d501bffb Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 12:25:18 +0200 Subject: [PATCH 08/12] Clean code --- .../android/ui/fragment/BankrollFragment.kt | 2 +- .../ui/fragment/ComparisonChartFragment.kt | 4 +- .../android/ui/interfaces/FilterHandler.kt | 48 ------------------- 3 files changed, 2 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt index 3af69812..5d07aaf4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollFragment.kt @@ -215,7 +215,7 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour override fun updateUIAfterUndoDeletion(newItem: RealmObject) { // TODO: Improve that - // We are recreating a Bankroll report because the last one if invalid => the bankroll of the setup has been deleted + // We are recreating a Bankroll report because the last one is invalid => the bankroll of the setup has been deleted deletedRow?.let { row -> val bankrollReportSetup = BankrollReportSetup(newItem as Bankroll) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt index 629129bb..f044678b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt @@ -93,9 +93,7 @@ class ComparisonChartFragment : PokerAnalyticsFragment(), StaticRowRepresentable private fun initUI() { setDisplayHomeAsUpEnabled(true) - - //TODO: Localize title - setToolbarTitle("Comparison chart") + setToolbarTitle(getString(R.string.comparison_chart)) parentActivity?.let { viewPagerAdapter = ComparisonChartPagerAdapter(requireContext(), it.supportFragmentManager) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt b/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt index 12c1b91e..85b301d5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt @@ -57,54 +57,6 @@ interface FilterHandler { * Manage filters */ fun manageFilters(fragment: Fragment) { - - val context = fragment.requireContext() - val filterId = Preferences.getActiveFilterId(context) - FiltersActivity.newInstanceForResult(fragment = fragment, currentFilterable = currentFilterable) - - - //TODO: Clean - /* - val filterSelected = filterId != null - - val realm = Realm.getDefaultInstance() - val count = realm.where().count().toInt() - realm.close() - - val choices = ArrayList() - choices.add(fragment.getString(R.string.new_str)) - - if (count > 0) { - choices.add(fragment.getString(R.string.load_from_db)) - } - - if (filterSelected) { - choices.add(fragment.getString(R.string.modify_current_filter)) - choices.add(fragment.getString(R.string.remove_filter)) - } - - val builder = AlertDialog.Builder(context) - builder.setTitle(R.string.filter_selection) - .setCancelable(true) - .setItems(choices.toTypedArray()) { _, which -> - Timber.d("Click on $which") - when (which) { - 0 -> FiltersActivity.newInstanceForResult(fragment = fragment, currentFilterable = currentFilterable) - 1 -> DataListActivity.newSelectInstance(fragment, LiveData.FILTER.ordinal) - 2 -> FiltersActivity.newInstanceForResult(fragment = fragment, filterId = filterId, currentFilterable = currentFilterable) - 3 -> { - Preferences.removeActiveFilterId(context) - filterWasUpdated = true - removeFilter() - } - } - } - .setNegativeButton(R.string.cancel) { _, _ -> - Timber.d("Click on cancel") - } - - builder.show() - */ } } \ No newline at end of file From b8c5255cda07c5213b55441e37771f7179ae9593 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 12:36:51 +0200 Subject: [PATCH 09/12] Add new string --- app/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 80ab8030..2daa133f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -33,6 +33,7 @@ Save Report Update %s Comparison chart + The filter cannot be deleted because it is currently selected. Address Naming suggestions From b370a6f4414b0540e4e7eb186bb8da9619895fb2 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 12:37:46 +0200 Subject: [PATCH 10/12] Add context for some Deletable functions & improve Filter deletion --- .../pokeranalytics/android/model/interfaces/Manageable.kt | 7 ++++--- .../net/pokeranalytics/android/model/realm/Bankroll.kt | 4 ++-- .../net/pokeranalytics/android/model/realm/CustomField.kt | 2 +- .../pokeranalytics/android/model/realm/CustomFieldEntry.kt | 3 +-- .../java/net/pokeranalytics/android/model/realm/Filter.kt | 7 ++++--- .../java/net/pokeranalytics/android/model/realm/Game.kt | 2 +- .../net/pokeranalytics/android/model/realm/Location.kt | 4 ++-- .../net/pokeranalytics/android/model/realm/ReportSetup.kt | 2 +- .../android/model/realm/TournamentFeature.kt | 4 ++-- .../pokeranalytics/android/model/realm/TournamentName.kt | 4 ++-- .../net/pokeranalytics/android/model/realm/Transaction.kt | 2 +- .../pokeranalytics/android/model/realm/TransactionType.kt | 2 +- .../ui/fragment/components/DeletableItemFragment.kt | 6 ++---- .../android/ui/fragment/data/CustomFieldDataFragment.kt | 5 ++--- .../android/ui/fragment/data/DataManagerFragment.kt | 4 ++-- 15 files changed, 28 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt index 7dc3068b..efc63551 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.interfaces +import android.content.Context import io.realm.Realm import io.realm.RealmModel import net.pokeranalytics.android.R @@ -106,11 +107,11 @@ interface Deletable : Identifiable { /** * A method to define if an object is safe for deletion in database */ - fun isValidForDelete(realm: Realm): Boolean + fun isValidForDelete(context: Context, realm: Realm): Boolean - fun getDeleteStatus(realm: Realm): DeleteValidityStatus { - if (!isValidForDelete(realm)) { + fun getDeleteStatus(context: Context, realm: Realm): DeleteValidityStatus { + if (!isValidForDelete(context, realm)) { return DeleteValidityStatus.INVALID } return DeleteValidityStatus.VALID 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 3a7ef8bc..1d1f34f7 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 @@ -66,12 +66,12 @@ open class Bankroll : RealmObject(), NameManageable, RowRepresentable { } } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return realm.where().equalTo("bankroll.id", id).findAll().isEmpty() && realm.where().equalTo("bankroll.id", id).findAll().isEmpty() } - override fun getDeleteStatus(realm: Realm): DeleteValidityStatus { + override fun getDeleteStatus(context: Context, realm: Realm): DeleteValidityStatus { return if (!realm.where().equalTo("bankroll.id", id).findAll().isEmpty()) { DeleteValidityStatus.SESSIONS_LINKED } else if (!realm.where().equalTo("bankroll.id", id).findAll().isEmpty()) { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt index e5f98fee..b5ef7161 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt @@ -117,7 +117,7 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa return realm.where(this::class.java).equalTo("name", this.name).and().notEqualTo("id", this.id).findAll().isNotEmpty() } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return true } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt index 67a8bcbb..ff8ead6b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt @@ -10,7 +10,6 @@ import io.realm.kotlin.where import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.ModelException import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus -import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType @@ -95,7 +94,7 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable { this.value = value as String? ?: "" } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { if (realm.where().contains("customFieldEntries.id", id).findAll().isNotEmpty()) { return false } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt index a7576a40..02d35349 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt @@ -16,6 +16,7 @@ import net.pokeranalytics.android.ui.view.ImageDecorator 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.util.Preferences import java.util.* /** @@ -178,11 +179,11 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Im return this.query.getName(context) } - override fun isValidForDelete(realm: Realm): Boolean { - return true + override fun isValidForDelete(context: Context, realm: Realm): Boolean { + return id != Preferences.getActiveFilterId(context) } override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int { - return R.string.relationship_error + return R.string.filter_currently_selected } } 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 2334baa0..8c53f9ff 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 @@ -91,7 +91,7 @@ open class Game : RealmObject(), NameManageable, StaticRowRepresentableDataSourc } } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return realm.where().equalTo("game.id", id).findAll().isEmpty() } } 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 878486ca..1453941b 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 @@ -7,8 +7,8 @@ import io.realm.RealmObject import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.NameManageable +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import java.util.* @@ -59,7 +59,7 @@ open class Location : RealmObject(), NameManageable, RowRepresentable { } } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return realm.where().equalTo("location.id", id).findAll().isEmpty() } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt index 82b996e8..f09a7764 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/ReportSetup.kt @@ -70,7 +70,7 @@ open class ReportSetup : RealmObject(), RowRepresentable, Deletable { // Deletable - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return true } 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 95e6aaaa..1e6ca919 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 @@ -7,8 +7,8 @@ import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.CountableUsage -import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.NameManageable +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor @@ -73,7 +73,7 @@ open class TournamentFeature : RealmObject(), NameManageable, StaticRowRepresent } } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return realm.where().equalTo("tournamentFeatures.id", id).findAll().isEmpty() } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt index 5fe708c2..8c72ba2b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt @@ -6,8 +6,8 @@ import io.realm.RealmObject import io.realm.annotations.PrimaryKey import io.realm.kotlin.where import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.model.interfaces.NameManageable +import net.pokeranalytics.android.model.interfaces.SaveValidityStatus import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor @@ -67,7 +67,7 @@ open class TournamentName : RealmObject(), NameManageable, StaticRowRepresentabl } } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return realm.where().equalTo("tournamentName.id", id).findAll().isEmpty() } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt index 56296685..930a4776 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Transaction.kt @@ -115,7 +115,7 @@ open class Transaction : RealmObject(), Manageable, StaticRowRepresentableDataSo return realm.where().equalTo("id", id).findFirst() != null } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return true } 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 d511ca28..55f20221 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 @@ -90,7 +90,7 @@ open class TransactionType : RealmObject(), NameManageable, StaticRowRepresentab } } - override fun isValidForDelete(realm: Realm): Boolean { + override fun isValidForDelete(context: Context, realm: Realm): Boolean { return true } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt index 7a777c74..cc193389 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/DeletableItemFragment.kt @@ -15,10 +15,8 @@ import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Identifiable -import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter -import timber.log.Timber /** * Deletable Item Fragment @@ -90,7 +88,7 @@ abstract class DeletableItemFragment : RealmFragment() { val deletableItem = (itemToDelete as Deletable) // Check if the object is valid for the deletion - if (deletableItem.isValidForDelete(this.getRealm())) { + if (deletableItem.isValidForDelete(requireContext(), this.getRealm())) { deletedItem = getRealm().copyFromRealm(itemToDelete) lastDeletedItemPosition = itemPosition getRealm().executeTransaction { @@ -102,7 +100,7 @@ abstract class DeletableItemFragment : RealmFragment() { showUndoSnackBar() } else { dataListAdapter.notifyItemChanged(itemPosition) - val status = deletableItem.getDeleteStatus(this.getRealm()) + val status = deletableItem.getDeleteStatus(requireContext(), this.getRealm()) val message = deletableItem.getFailedDeleteMessage(status) val builder = AlertDialog.Builder(requireContext()) .setMessage(message) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt index b0d68bbe..5559007c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt @@ -24,7 +24,6 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.util.NULL_TEXT import java.util.* -import kotlin.collections.ArrayList /** * Custom EditableDataFragment to manage the Transaction data @@ -180,8 +179,8 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa super.onRowDeleted(row) when (row) { is CustomFieldEntry -> { - if (!row.isValidForDelete(getRealm())) { - val status = row.getDeleteStatus(getRealm()) + if (!row.isValidForDelete(requireContext(), getRealm())) { + val status = row.getDeleteStatus(requireContext(), getRealm()) val message = row.getFailedDeleteMessage(status) showAlertDialog(requireContext(), R.string.cf_entry_delete_popup_title, message, showCancelButton = true, positiveAction = { customField.deleteEntry(row) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt index 938d9e09..686671d8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt @@ -126,13 +126,13 @@ open class DataManagerFragment : RealmFragment() { val deletable = this.item as Deletable val realm = this.getRealm() - if (deletable.isValidForDelete(realm)) { + if (deletable.isValidForDelete(requireContext(), realm)) { val intent = Intent() intent.putExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, deletable.id) activity?.setResult(Activity.RESULT_OK, intent) activity?.finish() } else { - val status = deletable.getDeleteStatus(realm) + val status = deletable.getDeleteStatus(requireContext(), realm) val message = deletable.getFailedDeleteMessage(status) val builder = AlertDialog.Builder(requireContext()) .setMessage(message) From c10d4d749fb9a2596d9d440ee6a4be0e594080fa Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 14:26:36 +0200 Subject: [PATCH 11/12] Add padding for Feed recyclerview --- app/src/main/res/layout/fragment_feed.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/layout/fragment_feed.xml b/app/src/main/res/layout/fragment_feed.xml index e287e2ee..9ee9dc14 100644 --- a/app/src/main/res/layout/fragment_feed.xml +++ b/app/src/main/res/layout/fragment_feed.xml @@ -61,6 +61,8 @@ android:id="@+id/recyclerView" android:layout_width="0dp" android:layout_height="0dp" + android:paddingBottom="72dp" + android:clipToPadding="false" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" From 5d02ab88722ad9a85d1b7d57dac44a54369a9b74 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 24 May 2019 14:27:15 +0200 Subject: [PATCH 12/12] Manage placeholder for bottom sheet edittext --- .../BottomSheetDoubleEditTextFragment.kt | 18 ++++++++++++------ .../bottomsheet/BottomSheetEditTextFragment.kt | 9 ++++++++- .../bottomsheet/BottomSheetFragment.kt | 5 ++++- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt index 38014ea2..74c8d6b8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt @@ -27,7 +27,6 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { override fun onStart() { super.onStart() - if (isEditingBlinds) { editText2.requestFocus() } else { @@ -43,6 +42,7 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { * Init data */ private fun initData() { + valueHasPlaceholder = true isEditingBlinds = row == SessionRow.BLINDS } @@ -64,17 +64,23 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { values[0] = (data[0].defaultValue ?: "").toString() values[1] = (data[1].defaultValue ?: "").toString() - editText1.setText(values[0]) - editText2.setText(values[1]) - data[0].hint?.let { editText1.hint = getString(it) } editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES + data[1].hint?.let { editText2.hint = getString(it) } + editText2.inputType = data[1].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES + + if (valueHasPlaceholder) { + editText1.hint = values[0] + editText2.hint = values[1] + } else { + editText1.setText(values[0]) + editText2.setText(values[1]) + } + editText1.addTextChangedListener { values[0] = it?.toString() ?: "" } - data[1].hint?.let { editText2.hint = getString(it) } - editText2.inputType = data[1].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES editText2.addTextChangedListener { values[1] = it?.toString() ?: "" if (isEditingBlinds) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt index d742fbd0..537da59b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt @@ -43,12 +43,14 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { * Init data */ private fun initData() { + valueHasPlaceholder = true } /** * Init UI */ private fun initUI() { + val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") if (data.size != 1) { throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") @@ -62,7 +64,12 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { this.value = it?.toString() } data[0].defaultValue?.let { - editText1.setText(it.toString()) + if (valueHasPlaceholder) { + this.value = it.toString() + editText1.hint = it.toString() + } else { + editText1.setText(it.toString()) + } } editText1.setOnEditorActionListener { _, actionId, _ -> diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt index 8f4449ea..8c33bf13 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt @@ -30,6 +30,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { lateinit var row: RowRepresentable lateinit var delegate: RowRepresentableDelegate var currentCurrency: Currency? = null + var valueHasPlaceholder: Boolean = false private var isClearable: Boolean = true private var isDeletable: Boolean = false @@ -46,7 +47,8 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { rowRepresentableEditDescriptors: ArrayList?, isClearable: Boolean? = true, currentCurrency: Currency? = null, - isDeletable: Boolean? = false + isDeletable: Boolean? = false, + valueHasPlaceholder: Boolean? = false ): BottomSheetFragment { val bottomSheetFragment = row.bottomSheetType.newInstance() bottomSheetFragment.show(fragmentManager, "bottomSheet") @@ -55,6 +57,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { bottomSheetFragment.rowRepresentableEditDescriptors = rowRepresentableEditDescriptors bottomSheetFragment.isClearable = isClearable ?: true bottomSheetFragment.isDeletable = isDeletable ?: true + bottomSheetFragment.valueHasPlaceholder = valueHasPlaceholder ?: true bottomSheetFragment.currentCurrency = currentCurrency return bottomSheetFragment }