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. 60
      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.*
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where import io.realm.kotlin.where
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.Filterable
import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.Query
import net.pokeranalytics.android.model.filter.QueryCondition 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.model.interfaces.Identifiable
import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.interfaces.FilterableType
import net.pokeranalytics.android.ui.view.RowRepresentable 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 * 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 * 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 { companion object {
@ -162,4 +165,12 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable {
if (name.isNotEmpty()) return name if (name.isNotEmpty()) return name
return this.query.getName(context) 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 package net.pokeranalytics.android.ui.fragment
import android.app.Activity
import android.app.Activity.RESULT_OK import android.app.Activity.RESULT_OK
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.* import android.view.*
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.chip.Chip
import io.realm.kotlin.where import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_editable_data.appBar
import kotlinx.android.synthetic.main.fragment_filters.view.* 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.R
import net.pokeranalytics.android.model.realm.Filter import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.ui.activity.FilterDetailsActivity 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.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource 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.fragment.components.RealmFragment
import net.pokeranalytics.android.ui.interfaces.FilterableType import net.pokeranalytics.android.ui.interfaces.FilterableType
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow import net.pokeranalytics.android.ui.view.rowrepresentable.FilterCategoryRow
import net.pokeranalytics.android.util.Preferences
import net.pokeranalytics.android.util.sorted
import timber.log.Timber import timber.log.Timber
@ -56,7 +61,7 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) 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") Timber.d("onActivityResult: $requestCode")
@ -136,6 +141,49 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager 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,15 +256,17 @@ open class FiltersFragment : RealmFragment(), StaticRowRepresentableDataSource,
/** /**
* Delete data * Delete data
*/ */
private fun deleteFilter() { private fun deleteFilter(closeActivity: Boolean = true) {
Timber.d("Delete queryWith") Timber.d("Delete queryWith")
val realm = getRealm() val realm = getRealm()
realm.beginTransaction() realm.beginTransaction()
currentFilter?.deleteFromRealm() currentFilter?.deleteFromRealm()
realm.commitTransaction() realm.commitTransaction()
if (closeActivity) {
finishActivityWithResult("") finishActivityWithResult("")
} }
}
/** /**
* Finish the activity with a result * Finish the activity with a result

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

@ -19,6 +19,16 @@
app:title="Poker Analytics" app:title="Poker Analytics"
app:titleTextColor="@color/white" /> 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> </com.google.android.material.appbar.AppBarLayout>
@ -46,74 +56,4 @@
</androidx.core.widget.NestedScrollView> </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> </androidx.coordinatorlayout.widget.CoordinatorLayout>
Loading…
Cancel
Save