Add filter name edition

feature/top10
Aurelien Hubert 7 years ago
parent 25d2fdac15
commit c94b42abe8
  1. 5
      app/src/main/AndroidManifest.xml
  2. 68
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  3. 58
      app/src/main/java/net/pokeranalytics/android/ui/activity/FiltersListActivity.kt
  4. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt
  6. 122
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersListFragment.kt
  7. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt
  8. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt
  9. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt
  10. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetNumericTextFragment.kt
  11. 4
      app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt
  12. 15
      app/src/main/res/layout/activity_filters_list.xml

@ -109,6 +109,11 @@
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.FiltersListActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name="net.pokeranalytics.android.ui.activity.EditableDataActivity"
android:launchMode="singleTop"

@ -1,7 +1,10 @@
package net.pokeranalytics.android.model.realm
import android.content.Context
import io.realm.*
import io.realm.Realm
import io.realm.RealmList
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where
import net.pokeranalytics.android.R
@ -11,11 +14,15 @@ import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.interfaces.CountableUsage
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.model.interfaces.Editable
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
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.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow
import timber.log.Timber
import java.util.*
/**
@ -23,12 +30,12 @@ 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, CountableUsage, ImageDecorator {
open class Filter : RealmObject(), RowRepresentable, Editable, Deletable, CountableUsage, ImageDecorator {
companion object {
// Create a new instance
fun newInstance(filterableTypeUniqueIdentifier:Int): Filter {
fun newInstance(filterableTypeUniqueIdentifier: Int): Filter {
val filter = Filter()
filter.filterableTypeUniqueIdentifier = filterableTypeUniqueIdentifier
return filter
@ -50,6 +57,16 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Co
}
}
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
@PrimaryKey
override var id = UUID.randomUUID().toString()
@ -78,21 +95,21 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Co
}
fun createOrUpdateFilterConditions(filterConditionRows: ArrayList<QueryCondition>) {
println("list of querys saving: ${filterConditionRows.map { it.id }}")
println("list of querys previous: ${this.filterConditions.map { it.queryCondition.id }}")
Timber.d("list of querys saving: ${filterConditionRows.map { it.id }}")
Timber.d("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 }}")
Timber.d("list of querys: ${this.map { it.id }}")
val casted = arrayListOf<QueryCondition>()
casted.addAll(this)
val newFilterCondition = FilterCondition(casted)
@ -113,17 +130,17 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Co
fun countBy(filterCategoryRow: FilterCategoryRow): Int {
val sections = filterCategoryRow.filterSectionRows.map { it.name }
println("list of sections $sections")
Timber.d("list of sections $sections")
val savedSections = filterConditions.filter { sections.contains(it.sectionName) }.flatMap { it.queryCondition.id }
println("list of savedSections $savedSections")
Timber.d("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")
Timber.d("list of saved queries ${filterConditions.map { it.queryCondition.id }}")
Timber.d("list of contains ${filterElementRow.id}")
val contained = filterConditions.flatMap { it.queryCondition.id }.contains(filterElementRow.id.first())
Timber.d("list of : $contained")
return contained
}
@ -175,4 +192,27 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Co
override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
return R.string.relationship_error
}
override val bottomSheetType: BottomSheetType
get() {
return BottomSheetType.EDIT_TEXT
}
override fun localizedTitle(context: Context): String {
return context.getString(R.string.name)
}
override fun editingDescriptors(map: Map<String, Any?>): ArrayList<RowRepresentableEditDescriptor>? {
val defaultValue: String? by map
return arrayListOf(RowRepresentableEditDescriptor(defaultValue, R.string.name))
}
override fun updateValue(value: Any?, row: RowRepresentable) {
realm.executeTransaction {
val newName = value as String? ?: ""
if (newName.isNotEmpty()) {
name = newName
}
}
}
}

@ -0,0 +1,58 @@
package net.pokeranalytics.android.ui.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.activity_filters_list.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.FiltersListFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode
class FiltersListActivity : PokerAnalyticsActivity() {
enum class IntentKey(val keyName: String) {
DATA_TYPE("DATA_TYPE"),
LIVE_DATA_TYPE("LIVE_DATA_TYPE"),
ITEM_DELETED("ITEM_DELETED"),
SHOW_ADD_BUTTON("SHOW_ADD_BUTTON"),
}
companion object {
fun newInstance(context: Context, dataType: Int) {
context.startActivity(getIntent(context, dataType))
}
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, showAddButton: Boolean = true): Intent {
val intent = Intent(context, FiltersListActivity::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)
setContentView(R.layout.activity_filters_list)
initUI()
}
/**
* 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 = filtersListFragment as FiltersListFragment
fragment.setData(dataType)
fragment.updateUI(showAddButton)
}
}

@ -11,7 +11,6 @@ import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import io.realm.Realm
import io.realm.RealmResults
import io.realm.kotlin.isValid
import kotlinx.android.synthetic.main.fragment_data_list.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
@ -25,7 +24,6 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment
import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback
import net.pokeranalytics.android.ui.interfaces.FilterableType
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.extensions.sorted
@ -45,7 +43,7 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS
/**
* Set fragment data
*/
fun setData(dataType: Int) {
open fun setData(dataType: Int) {
this.dataType = LiveData.values()[dataType]
this.identifiableClass = this.dataType.relatedEntity

@ -14,9 +14,9 @@ import kotlinx.android.synthetic.main.fragment_filters.view.toolbar
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.DataListActivity
import net.pokeranalytics.android.ui.activity.FilterDetailsActivity
import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.ui.activity.FiltersListActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
@ -159,7 +159,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
moreFilters.setOnClickListener {
LiveData.FILTER.subType = filterableType.uniqueIdentifier
DataListActivity.newSelectInstance(this, LiveData.FILTER.ordinal, false)
FiltersListActivity.newSelectInstance(this, LiveData.FILTER.ordinal, false)
}
mostUsedFiltersLayout.isVisible = showMostUsedFiltersLayout

@ -0,0 +1,122 @@
package net.pokeranalytics.android.ui.fragment
import android.app.Activity
import android.content.Context
import android.content.Intent
import io.realm.RealmResults
import net.pokeranalytics.android.model.LiveData
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.EditableDataActivity
import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.interfaces.FilterHandler.Companion.INTENT_FILTER_UPDATE_FILTER_UI
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.Preferences
import timber.log.Timber
open class FiltersListFragment : DataListFragment() {
private var identifiableClass: Class<out Deletable> = Filter::class.java
private var dataType: LiveData = LiveData.FILTER
private lateinit var items: RealmResults<Filter>
/**
* Set fragment data
*/
override fun setData(dataType: Int) {
super.setData(dataType)
this.dataType = LiveData.FILTER
this.identifiableClass = Filter::class.java
setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext()))
this.items = this.retrieveItems(getRealm()) as RealmResults<Filter>
}
override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
Timber.d("rowRepresentableForPosition: ${this.items[position] as RowRepresentable}")
return this.items[position] as RowRepresentable
}
override fun numberOfRows(): Int {
return this.items.size
}
override fun adapterRows(): List<RowRepresentable>? {
return items
}
override fun viewTypeForPosition(position: Int): Int {
val viewType = (this.items[position] as RowRepresentable).viewType
return if (viewType != -1) viewType else RowViewType.DATA.ordinal
}
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return when (row) {
is Filter -> row.editingDescriptors(mapOf("defaultValue" to row.name))
else -> super.editDescriptors(row)
}
}
override fun onRowValueChanged(value: Any?, row: RowRepresentable) {
when (row) {
is Filter -> {
row.updateValue(value, row)
dataListAdapter.refreshRow(row)
updateFilterUIIfNecessary(requireContext(), row.id)
}
else -> super.onRowValueChanged(value, row)
}
}
override fun onRowDeleted(row: RowRepresentable) {
when (row) {
is Filter -> {
val filterId = row.id
deleteItem(dataListAdapter, items, filterId)
if (filterId == Preferences.getActiveFilterId(requireContext())) {
Preferences.setActiveFilterId("", requireContext())
updateFilterUIIfNecessary(requireContext(), "")
}
}
else -> super.onRowDeleted(row)
}
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) {
is Filter -> {
if (fromAction) {
val data = row.editingDescriptors(mapOf("defaultValue" to row.name))
BottomSheetFragment.create(fragmentManager, row, this, data, false, isDeletable = true, valueHasPlaceholder = false)
} else {
val intent = Intent()
intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, row.id)
activity?.setResult(Activity.RESULT_OK, intent)
activity?.finish()
}
}
else -> {
val identifier = (row as Identifiable).id
EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS)
}
}
}
/**
* Update filter UI
*/
fun updateFilterUIIfNecessary(context: Context, filterId: String) {
if (filterId == Preferences.getActiveFilterId(context)) {
// Send broadcast
val intent = Intent()
intent.action = INTENT_FILTER_UPDATE_FILTER_UI
context.sendBroadcast(intent)
}
}
}

@ -42,7 +42,6 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() {
* Init data
*/
private fun initData() {
valueHasPlaceholder = true
isEditingBlinds = row == SessionRow.BLINDS
}

@ -43,7 +43,6 @@ class BottomSheetEditTextFragment : BottomSheetFragment() {
* Init data
*/
private fun initData() {
valueHasPlaceholder = true
}
/**

@ -48,7 +48,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() {
isClearable: Boolean? = true,
currentCurrency: Currency? = null,
isDeletable: Boolean? = false,
valueHasPlaceholder: Boolean? = false
valueHasPlaceholder: Boolean? = null
): BottomSheetFragment {
val bottomSheetFragment = row.bottomSheetType.newInstance()
bottomSheetFragment.show(fragmentManager, "bottomSheet")

@ -36,7 +36,6 @@ class BottomSheetNumericTextFragment : BottomSheetFragment() {
* Init data
*/
private fun initData() {
valueHasPlaceholder = true
}
/**

@ -17,7 +17,7 @@ enum class FilterActivityRequestCode {
;
}
enum class FilterableType(override var uniqueIdentifier: Int): IntIdentifiable {
enum class FilterableType(override var uniqueIdentifier: Int) : IntIdentifiable {
ALL(0),
SESSION(1),
TRANSACTION(2),
@ -42,7 +42,7 @@ interface FilterHandler {
fun applyFilter()
fun removeFilter()
fun saveFilter(context: Context, filterId:String) {
fun saveFilter(context: Context, filterId: String) {
Preferences.setActiveFilterId(filterId, context)

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<fragment
android:id="@+id/filtersListFragment"
android:name="net.pokeranalytics.android.ui.fragment.FiltersListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_data_list" />
</LinearLayout>
Loading…
Cancel
Save