Merge branch 'dev' of gitlab.com:stax-river/poker-analytics into dev

dev
Laurent 7 years ago
commit 25a57d0eb1
  1. 14
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  2. 2
      app/src/main/java/net/pokeranalytics/android/model/LiveData.kt
  3. 9
      app/src/main/java/net/pokeranalytics/android/model/filter/Query.kt
  4. 9
      app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
  5. 34
      app/src/main/java/net/pokeranalytics/android/model/realm/Filter.kt
  6. 7
      app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt
  7. 7
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt
  8. 12
      app/src/main/java/net/pokeranalytics/android/ui/fragment/FeedFragment.kt
  9. 4
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportCreationFragment.kt
  10. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt
  11. 12
      app/src/main/java/net/pokeranalytics/android/ui/interfaces/FilterHandler.kt
  12. 35
      app/src/main/java/net/pokeranalytics/android/util/extensions/RealmExtensions.kt

@ -11,9 +11,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.pokeranalytics.android.model.migrations.Patcher
import net.pokeranalytics.android.model.migrations.PokerAnalyticsMigration
import net.pokeranalytics.android.model.realm.ComputableResult
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.SessionSet
import net.pokeranalytics.android.model.utils.Seed
import net.pokeranalytics.android.util.FakeDataManager
import net.pokeranalytics.android.util.PokerAnalyticsLogs
@ -42,13 +40,11 @@ class PokerAnalyticsApplication : Application() {
.build()
Realm.setDefaultConfiguration(realmConfiguration)
val realm = Realm.getDefaultInstance()
realm.executeTransaction {
realm.where(Session::class.java).findAll().deleteAllFromRealm()
realm.where(ComputableResult::class.java).findAll().deleteAllFromRealm()
realm.where(SessionSet::class.java).findAll().deleteAllFromRealm()
}
realm.close()
// val realm = Realm.getDefaultInstance()
// realm.executeTransaction {
// realm.where(Session::class.java).findAll().deleteAllFromRealm()
// }
// realm.close()
// Set up Crashlytics, disabled for debug builds
val crashlyticsKit = Crashlytics.Builder()

@ -90,7 +90,7 @@ enum class LiveData : Localizable {
* Return the update entity titleResId
*/
fun updateEntityLocalizedTitle(context: Context): String {
return "${context.getString(R.string.update_entity)} ${this.localizedTitle(context).toLowerCase()}"
return context.getString(R.string.update_entity, this.localizedTitle(context).toLowerCase())
}
}

@ -4,6 +4,7 @@ import android.content.Context
import io.realm.RealmQuery
import io.realm.kotlin.where
import net.pokeranalytics.android.R
import net.pokeranalytics.android.util.NULL_TEXT
fun List<Query>.mapFirstCondition() : List<QueryCondition> {
return this.map { it.conditions.first() }
@ -41,6 +42,14 @@ class Query {
this._conditions.addAll(queryConditions)
}
val defaultName: String
get() {
return when (this._conditions.size) {
0 -> NULL_TEXT
else -> this._conditions.joinToString("") { it.id.joinToString("") }
}
}
fun getName(context: Context): String {
return when (this._conditions.size) {
0 -> context.getString(R.string.all_sessions) // @todo should be dependant of the underlying type, ie. Session, Transaction...

@ -124,13 +124,16 @@ class PokerAnalyticsMigration : RealmMigration {
}
}
schema.get("Session")?.let {
it.addField("startDateHourMinuteComponent", Double::class.java).setNullable("startDateHourMinuteComponent", true)
it.addField("endDateHourMinuteComponent", Double::class.java).setNullable("endDateHourMinuteComponent", true)
it.addField("startDateHourMinuteComponent", Double::class.java)
.setNullable("startDateHourMinuteComponent", true)
it.addField("endDateHourMinuteComponent", Double::class.java)
.setNullable("endDateHourMinuteComponent", true)
it.addRealmListField("customFieldEntries", CustomFieldEntry::class.java)
}
schema.get("Filter")?.addField("filterableTypeOrdinal", Integer::class.java)
schema.get("Filter")?.addField("useCount", Int::class.java)
schema.get("Filter")?.removeField("usageCount")
currentVersion++
}
}

@ -8,15 +8,14 @@ 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.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.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 net.pokeranalytics.android.util.Preferences
import java.util.*
/**
@ -24,12 +23,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, ImageDecorator {
open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, CountableUsage, 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
return filter
@ -61,25 +60,20 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Im
// the queryWith name
var name: String = ""
get() {
if (field.isEmpty()) {
return this.query.defaultName
}
return field
}
// the number of use of the queryWith,
// for MutableRealmInteger, see https://realm.io/docs/java/latest/#counters
val usageCount: MutableRealmInteger = MutableRealmInteger.valueOf(0)
override var useCount: Int = 0
var filterConditions: RealmList<FilterCondition> = RealmList()
private set
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 {
@ -96,7 +90,7 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Im
it.groupId
}
.distinct()
.forEach { groupId ->
.forEach { groupId->
filterConditionRows
.filter {
it.groupId == groupId
@ -133,7 +127,7 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Im
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())
val contained = filterConditions.flatMap{ it.queryCondition.id }.contains(filterElementRow.id.first())
println("list of : $contained")
return contained
}
@ -180,10 +174,10 @@ open class Filter : RealmObject(), RowRepresentable, Identifiable, Deletable, Im
}
override fun isValidForDelete(context: Context, realm: Realm): Boolean {
return id != Preferences.getActiveFilterId(context)
return true
}
override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
return R.string.filter_currently_selected
return R.string.relationship_error
}
}

@ -55,13 +55,12 @@ class RowRepresentableAdapter(
return
}
/*
val index = this.dataSource.indexForRow(row)
val index = this.dataSource.adapterRows()?.indexOf(row) ?: -1
if (index >= 0) {
notifyItemChanged(index)
}
*/
notifyDataSetChanged()
//notifyDataSetChanged()
}
/**

@ -107,18 +107,11 @@ class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource
when (this.dataType) {
LiveData.FILTER -> {
if (fromAction) {
// Open filter params
val filter = row as Filter
FiltersActivity.newInstanceForResult(fragment = this, filterId = filter.id, currentFilterable = filter.filterableType)
} 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
EditableDataActivity.newInstanceForResult(this, this.dataType, identifier, REQUEST_CODE_DETAILS)

@ -195,14 +195,16 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
}
// Sessions
this.realmSessions = sessionFilter?.results() ?: run { getRealm().where<Session>().findAll() }.sort("startDate", Sort.DESCENDING)
this.realmSessions = sessionFilter?.results() ?: run { getRealm().where<Session>().findAll() }
this.realmSessions = this.realmSessions.sort("startDate", Sort.DESCENDING)
this.realmSessions.addChangeListener { _, _ ->
this.feedSessionAdapter.refreshData()
this.feedSessionAdapter.notifyDataSetChanged()
}
val pendingSessions = sessionFilter?.let { getRealm().where<Session>().alwaysFalse().findAll() } ?: run { getRealm().where<Session>().isNull("year").isNull("month").findAll().sort("startDate", Sort.DESCENDING) }
val distinctDateSessions = sessionFilter?.results("year", "month") ?: run { getRealm().where<Session>().distinct("year", "month").findAll() }.sort("startDate", Sort.DESCENDING)
var distinctDateSessions = sessionFilter?.results("year", "month") ?: run { getRealm().where<Session>().distinct("year", "month").findAll() }
distinctDateSessions = distinctDateSessions.sort("startDate", Sort.DESCENDING)
this.feedSessionAdapter = FeedSessionRowRepresentableAdapter(this, realmSessions, pendingSessions, distinctDateSessions)
}
@ -216,13 +218,15 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate {
}
// Transactions
this.realmTransactions = transactionFilter?.results() ?: run { getRealm().where<Transaction>().findAll()}.sort("date", Sort.DESCENDING)
this.realmTransactions = transactionFilter?.results() ?: run { getRealm().where<Transaction>().findAll()}
this.realmTransactions = this.realmTransactions.sort("date", Sort.DESCENDING)
this.realmTransactions.addChangeListener { _, _ ->
this.feedTransactionAdapter.refreshData()
this.feedTransactionAdapter.notifyDataSetChanged()
}
val distinctDateTransactions = transactionFilter?.results("year", "month") ?: run { getRealm().where<Transaction>().distinct("year", "month").findAll() }.sort("date", Sort.DESCENDING)
var distinctDateTransactions = transactionFilter?.results("year", "month") ?: run { getRealm().where<Transaction>().distinct("year", "month").findAll() }
distinctDateTransactions = distinctDateTransactions.sort("date", Sort.DESCENDING)
this.feedTransactionAdapter = FeedTransactionRowRepresentableAdapter(this, realmTransactions, distinctDateTransactions)
}

@ -82,6 +82,7 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR
setDisplayHomeAsUpEnabled(true)
this.optionsAdapter = RowRepresentableAdapter(this, this)
this.optionsAdapter.setHasStableIds(true)
val viewManager = LinearLayoutManager(requireContext())
recyclerView.apply {
@ -179,7 +180,7 @@ class ReportCreationFragment : RealmFragment(), RowRepresentableDataSource, RowR
this.updateUIWithCurrentStep()
} else {
this.next.isEnabled = this.assistant.nextEnabled
this.optionsAdapter.refreshRow(row)
this.optionsAdapter.notifyDataSetChanged()
}
}
@ -256,6 +257,7 @@ class Assistant {
return when (this.step) {
Step.STAT -> this.stats.contains(row as Stat)
Step.COMPARATOR -> this.comparators.contains(row as Criteria)
Step.FILTER -> this.filter == row
else -> false
}
}

@ -89,6 +89,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat
val dataSource = getDataSource()
this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this)
this.rowRepresentableAdapter.setHasStableIds(true)
this.recyclerView.adapter = rowRepresentableAdapter
// When creating an object, open automatically the keyboard for the first row

@ -36,6 +36,18 @@ interface FilterHandler {
fun saveFilter(context: Context, filterId:String) {
Preferences.setActiveFilterId(filterId, context)
println("<<<< save filter")
val realm = Realm.getDefaultInstance()
realm.beginTransaction()
currentFilter(context, realm)?.let {
println("<<<< old ${it.useCount}")
it.useCount++
println("<<<< new ${it.useCount}")
}
realm.commitTransaction()
realm.close()
// Send broadcast
val intent = Intent()
intent.action = INTENT_FILTER_UPDATE_FILTER_UI

@ -7,6 +7,7 @@ import io.realm.Sort
import io.realm.kotlin.where
import net.pokeranalytics.android.model.interfaces.CountableUsage
import net.pokeranalytics.android.model.interfaces.NameManageable
import net.pokeranalytics.android.model.realm.Filter
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.TournamentFeature
import net.pokeranalytics.android.model.realm.Transaction
@ -29,24 +30,30 @@ inline fun <reified T: NameManageable> Realm.getOrCreate(name: String) : T {
/**
* Returns all entities of the [clazz] sorted with their default sorting
*/
fun <T : RealmModel> Realm.sorted(clazz: Class<T>) : RealmResults<T> {
fun < T : RealmModel> Realm.sorted(clazz: Class<T>) : RealmResults<T> {
val items = this.where(clazz).findAll()
var sortField = arrayOf("name")
var resultSort = arrayOf(Sort.ASCENDING)
if (clazz is CountableUsage) {
this.updateUsageCount(clazz)
when (items.firstOrNull()) {
is Transaction -> {
println("<<<< is transaction")
sortField = arrayOf("date")
resultSort = arrayOf(Sort.DESCENDING)
}
val sortField = when (clazz) {
is CountableUsage -> "useCount"
is Transaction -> "date"
else -> "name"
is Filter -> {
println("<<<< is filter")
sortField = arrayOf("useCount", "name")
resultSort = arrayOf(Sort.DESCENDING, Sort.ASCENDING)
}
val resultSort = when (clazz) {
is CountableUsage -> Sort.DESCENDING
is Transaction -> Sort.DESCENDING
else -> Sort.ASCENDING
is CountableUsage -> {
println("<<<< is countable")
this.updateUsageCount(clazz)
sortField = arrayOf("useCount")
resultSort = arrayOf(Sort.DESCENDING)
}
return this.where(clazz).findAll().sort(sortField, resultSort)
}
return items.sort(sortField, resultSort)
}
/**

Loading…
Cancel
Save