Start working on filters management

dev
Aurelien Hubert 7 years ago
parent 880014f7bb
commit e2e8ea7903
  1. 13
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  2. 66
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt
  3. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticsFragment.kt
  4. 80
      app/src/main/res/layout/fragment_filters.xml

@ -4,9 +4,12 @@ import android.content.Context
import io.realm.*
import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition
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.RowRepresentable
@ -18,7 +21,7 @@ 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 {
open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable {
companion object {
@ -162,4 +165,12 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable {
if (name.isNotEmpty()) return name
return this.query.getName(context)
}
override fun isValidForDelete(realm: Realm): Boolean {
return true
}
override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
return R.string.relationship_error
}
}

@ -1,14 +1,16 @@
package net.pokeranalytics.android.ui.fragment
import android.app.Activity
import android.app.Activity.RESULT_OK
import android.content.Intent
import android.os.Bundle
import android.view.*
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.chip.Chip
import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_editable_data.*
import kotlinx.android.synthetic.main.fragment_filters.view.*
import kotlinx.android.synthetic.main.fragment_editable_data.appBar
import kotlinx.android.synthetic.main.fragment_editable_data.recyclerView
import kotlinx.android.synthetic.main.fragment_filters.*
import kotlinx.android.synthetic.main.fragment_filters.view.toolbar
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.FilterDetailsActivity
@ -16,10 +18,13 @@ import net.pokeranalytics.android.ui.activity.FiltersActivity
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.extensions.px
import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.interfaces.FilterableType
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.sorted
import timber.log.Timber
@ -37,7 +42,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
private var rows: ArrayList<RowRepresentable> = ArrayList()
private var filterMenu: Menu? = null
private var primaryKey: String? = null
private lateinit var filterableType: FilterableType
private lateinit var filterableType: FilterableType
private var selectedRow: RowRepresentable? = null
private var isUpdating = false
@ -56,7 +61,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_FILTER_DETAILS && resultCode == Activity.RESULT_OK) {
if (requestCode == REQUEST_CODE_FILTER_DETAILS && resultCode == RESULT_OK) {
/*
Timber.d("onActivityResult: $requestCode")
@ -136,6 +141,49 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
setHasFixedSize(true)
layoutManager = viewManager
}
val filters = getRealm().sorted(Filter::class.java)
val currentFilterId = Preferences.getActiveFilterId(requireContext())
mostUsedFilters.removeAllViews()
filters.forEachIndexed { index, filter ->
if (index < 5) {
val chip = Chip(requireContext())
chip.id = View.generateViewId()
chip.tag = filter.id
chip.text = filter.getDisplayName(requireContext())
chip.chipStartPadding = 8f.px
chip.chipEndPadding = 8f.px
chip.isCloseIconVisible = true
chip.isChecked = filter.id == currentFilterId
chip.setOnCloseIconClickListener {
Preferences.removeActiveFilterId(requireContext())
chip.isChecked = false
}
chip.setOnClickListener {
deleteFilter(false)
finishActivityWithResult(filter.id)
}
mostUsedFilters.addView(chip)
}
}
/*
Limit.values().forEach {
val chip = Chip(requireContext())
chip.id = it.ordinal
chip.text = it.shortName
chip.chipStartPadding = 8f.px
chip.chipEndPadding = 8f.px
chip.isChecked = false
mostUsedFilters.addView(chip)
}
mostUsedFilters.setOnCheckedChangeListener { _, i ->
}
*/
}
/**
@ -208,14 +256,16 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
/**
* Delete data
*/
private fun deleteFilter() {
private fun deleteFilter(closeActivity: Boolean = true) {
Timber.d("Delete queryWith")
val realm = getRealm()
realm.beginTransaction()
currentFilter?.deleteFromRealm()
realm.commitTransaction()
finishActivityWithResult("")
if (closeActivity) {
finishActivityWithResult("")
}
}
/**
@ -233,7 +283,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
*/
fun setData(primaryKey: String?, filterableType: FilterableType) {
this.primaryKey = primaryKey
this.filterableType = filterableType
this.filterableType = filterableType
}
}

@ -22,7 +22,7 @@ import net.pokeranalytics.android.model.filter.QueryCondition
import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.FiltersActivity
import net.pokeranalytics.android.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.fragment.components.FilterableFragment
import net.pokeranalytics.android.ui.fragment.report.ComposableTableReportFragment
import net.pokeranalytics.android.ui.interfaces.FilterActivityRequestCode
import net.pokeranalytics.android.ui.interfaces.FilterHandler
@ -31,7 +31,7 @@ import timber.log.Timber
import java.util.*
import kotlin.coroutines.CoroutineContext
class StatisticsFragment : RealmFragment(), FilterHandler {
class StatisticsFragment : FilterableFragment(), FilterHandler {
val coroutineContext: CoroutineContext
get() = Dispatchers.Main

@ -19,6 +19,16 @@
app:title="Poker Analytics"
app:titleTextColor="@color/white" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/mostUsedFilters"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:chipSpacing="8dp"
app:singleSelection="true" />
</com.google.android.material.appbar.AppBarLayout>
@ -46,74 +56,4 @@
</androidx.core.widget.NestedScrollView>
<com.google.android.material.bottomappbar.BottomAppBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.google.android.material.chip.ChipGroup
android:id="@+id/filtersTime"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
app:chipSpacing="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:singleSelection="true">
<com.google.android.material.chip.Chip
android:id="@+id/filter1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Filter 1" />
<com.google.android.material.chip.Chip
android:id="@+id/filter2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Filter 2" />
<com.google.android.material.chip.Chip
android:id="@+id/filter3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Filter 3" />
<com.google.android.material.chip.Chip
android:id="@+id/filter4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Filter 4" />
<com.google.android.material.chip.Chip
android:id="@+id/filter5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Filter 5" />
</com.google.android.material.chip.ChipGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
</com.google.android.material.bottomappbar.BottomAppBar>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Loading…
Cancel
Save