Start working on custom field, work in progress

dev
Aurelien Hubert 7 years ago
parent dc1405bf7a
commit e6df9e42ca
  1. 5
      app/src/main/java/net/pokeranalytics/android/model/LiveData.kt
  2. 68
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  3. 8
      app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt
  4. 12
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  5. 9
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt
  6. 83
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt
  7. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt
  8. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt
  9. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt
  10. 33
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt
  11. 5
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt
  12. 6
      app/src/main/res/menu/toolbar_session.xml

@ -23,7 +23,8 @@ enum class LiveData : Localizable {
TOURNAMENT_FEATURE,
TRANSACTION,
TRANSACTION_TYPE,
FILTER;
FILTER,
CUSTOM_FIELD;
fun items(realm: Realm, fieldName: String? = null, sortOrder: Sort? = null): RealmResults<*> {
val results = realm.where(this.relatedEntity).findAll().sort(fieldName ?: this.sortingFieldName, sortOrder ?: this.sorting)
@ -103,6 +104,7 @@ enum class LiveData : Localizable {
TRANSACTION -> Transaction::class.java
TRANSACTION_TYPE -> TransactionType::class.java
FILTER -> Filter::class.java
CUSTOM_FIELD -> CustomField::class.java
}
}
@ -145,6 +147,7 @@ enum class LiveData : Localizable {
TRANSACTION -> R.string.operations
TRANSACTION_TYPE -> R.string.operation_types
FILTER -> R.string.filter
CUSTOM_FIELD -> R.string.custom_fields
}
}

@ -1,19 +1,83 @@
package net.pokeranalytics.android.model.realm
import io.realm.Realm
import io.realm.RealmObject
import io.realm.annotations.Ignore
import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.DeleteValidityStatus
import net.pokeranalytics.android.model.interfaces.Manageable
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.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import java.util.*
open class CustomField : RealmObject() {
open class CustomField : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable {
companion object {
val rowRepresentation: List<RowRepresentable> by lazy {
val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME)
rows.addAll(CustomFieldRow.values())
rows
}
}
@PrimaryKey
var id = UUID.randomUUID().toString()
override var id = UUID.randomUUID().toString()
// The name of the currency field
var name: String = ""
// @todo
override fun getDisplayName(): String {
return this.name
}
@Ignore
override val viewType: Int = RowViewType.TITLE_VALUE_ARROW.ordinal
override fun adapterRows(): List<RowRepresentable>? {
return rowRepresentation
}
override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) {
SimpleRow.NAME -> this.name = value as String? ?: ""
}
}
override fun isValidForSave(): Boolean {
return true
}
override fun alreadyExists(realm: Realm): Boolean {
return realm.where<CustomField>().equalTo("id", id).findFirst() != null
}
override fun getFailedSaveMessage(status: SaveValidityStatus): Int {
//TODO:
return R.string.relationship_error
}
override fun isValidForDelete(realm: Realm): Boolean {
return true
}
override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
//TODO:
return R.string.relationship_error
}
}

@ -7,10 +7,7 @@ import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.fragment.BankrollEditDataFragment
import net.pokeranalytics.android.ui.fragment.EditableDataFragment
import net.pokeranalytics.android.ui.fragment.LocationDataFragment
import net.pokeranalytics.android.ui.fragment.TransactionDataFragment
import net.pokeranalytics.android.ui.fragment.data.*
class EditableDataActivity : PokerAnalyticsActivity() {
enum class IntentKey(val keyName: String) {
@ -62,9 +59,10 @@ class EditableDataActivity : PokerAnalyticsActivity() {
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
val fragment: EditableDataFragment = when (dataType) {
LiveData.BANKROLL.ordinal -> BankrollEditDataFragment()
LiveData.BANKROLL.ordinal -> BankrollDataFragment()
LiveData.LOCATION.ordinal -> LocationDataFragment()
LiveData.TRANSACTION.ordinal -> TransactionDataFragment()
LiveData.CUSTOM_FIELD.ordinal -> CustomFieldDataFragment()
else -> EditableDataFragment()
}

@ -11,12 +11,14 @@ import androidx.recyclerview.widget.DiffUtil
import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_session.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.extensions.SessionState
import net.pokeranalytics.android.model.extensions.getState
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus
import net.pokeranalytics.android.model.realm.Location
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.utils.FavoriteSessionFinder
import net.pokeranalytics.android.ui.activity.EditableDataActivity
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
@ -35,6 +37,8 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate {
companion object {
const val TIMER_DELAY = 60000L
const val REQUEST_CODE_NEW_CUSTOM_FIELD = 1000
}
private lateinit var parentActivity: PokerAnalyticsActivity
@ -88,6 +92,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate {
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item!!.itemId) {
R.id.stop -> stopSession()
R.id.newCustomField -> addNewCustomField()
R.id.restart -> restartTimer()
R.id.delete -> deleteSession()
}
@ -289,6 +294,13 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate {
updateSessionUI()
}
/**
* Add new custom field
*/
private fun addNewCustomField() {
EditableDataActivity.newInstanceForResult(this, LiveData.CUSTOM_FIELD.ordinal, requestCode = REQUEST_CODE_NEW_CUSTOM_FIELD)
}
/**
* Restart timer
*/

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment
package net.pokeranalytics.android.ui.fragment.data
import android.app.Activity.RESULT_OK
import android.content.Intent
@ -11,6 +11,7 @@ import net.pokeranalytics.android.model.retrofit.CurrencyConverterValue
import net.pokeranalytics.android.ui.activity.CurrenciesActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.fragment.CurrenciesFragment
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType
@ -30,7 +31,7 @@ import java.util.*
/**
* Custom EditableDataFragment to manage the Bankroll data
*/
class BankrollEditDataFragment : EditableDataFragment(), StaticRowRepresentableDataSource {
class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataSource {
companion object {
const val REQUEST_CODE_CURRENCY: Int = 100
@ -130,7 +131,9 @@ class BankrollEditDataFragment : EditableDataFragment(), StaticRowRepresentableD
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) {
BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollEditDataFragment, REQUEST_CODE_CURRENCY)
BankrollRow.CURRENCY -> CurrenciesActivity.newInstanceForResult(this@BankrollDataFragment,
REQUEST_CODE_CURRENCY
)
BankrollRow.REFRESH_RATE -> refreshRate()
else -> super.onRowSelected(position, row, fromAction)
}

@ -0,0 +1,83 @@
package net.pokeranalytics.android.ui.fragment.data
import android.os.Bundle
import android.view.View
import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
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.*
/**
* Custom EditableDataFragment to manage the Transaction data
*/
class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDataSource {
// Return the item as a Custom Field object
private val customField: CustomField
get() {
return this.item as CustomField
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
shouldOpenKeyboard = false
}
override fun getDataSource(): RowRepresentableDataSource {
return this
}
override fun adapterRows(): List<RowRepresentable>? {
return customField.adapterRows()
}
override fun stringForRow(row: RowRepresentable): String {
return when (row) {
SimpleRow.NAME -> if (customField.name.isNotEmpty()) customField.name else NULL_TEXT
else -> super.stringForRow(row)
}
}
override fun boolForRow(row: RowRepresentable): Boolean {
return when (row) {
CustomFieldRow.COPY_ON_DUPLICATE -> false
else -> super.boolForRow(row)
}
}
override fun editDescriptors(row: RowRepresentable): ArrayList<RowRepresentableEditDescriptor>? {
return when (row) {
SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.customField.name))
else -> null
}
}
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) {
else -> super.onRowSelected(position, row, fromAction)
}
}
override fun onRowValueChanged(value: Any?, row: RowRepresentable) {
super.onRowValueChanged(value, row)
rowRepresentableAdapter.refreshRow(row)
/*
GlobalScope.launch(Dispatchers.Main) {
delay(200)
when(row) {
TransactionRow.BANKROLL -> onRowSelected(0, TransactionRow.TYPE)
TransactionRow.TYPE -> onRowSelected(0, TransactionRow.AMOUNT)
TransactionRow.AMOUNT -> onRowSelected(0, TransactionRow.DATE)
TransactionRow.DATE -> onRowSelected(0, TransactionRow.COMMENT)
}
}
*/
}
}

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment
package net.pokeranalytics.android.ui.fragment.data
import android.app.Activity.RESULT_OK
import android.content.Intent

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment
package net.pokeranalytics.android.ui.fragment.data
import android.os.Bundle
import android.view.View

@ -1,4 +1,4 @@
package net.pokeranalytics.android.ui.fragment
package net.pokeranalytics.android.ui.fragment.data
import android.os.Bundle
import android.view.View

@ -0,0 +1,33 @@
package net.pokeranalytics.android.ui.view.rowrepresentable
import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType
import net.pokeranalytics.android.ui.view.DefaultEditDataSource
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
enum class CustomFieldRow : RowRepresentable, DefaultEditDataSource {
COPY_ON_DUPLICATE;
override val resId: Int?
get() {
return when (this) {
COPY_ON_DUPLICATE -> R.string.copy_on_duplicate
}
}
override val viewType: Int
get() {
return when (this) {
COPY_ON_DUPLICATE -> RowViewType.TITLE_SWITCH.ordinal
}
}
override val bottomSheetType: BottomSheetType
get() {
return when (this) {
COPY_ON_DUPLICATE -> BottomSheetType.NONE
}
}
}

@ -23,6 +23,7 @@ enum class SettingRow : RowRepresentable {
CURRENCY,
// Data management
CUSTOM_FIELD,
BANKROLL,
GAME,
LOCATION,
@ -59,8 +60,7 @@ enum class SettingRow : RowRepresentable {
resId = R.string.data_management
)
)
rows.addAll(arrayListOf(BANKROLL, GAME, LOCATION, TOURNAMENT_NAME, TOURNAMENT_FEATURE, TRANSACTION_TYPE))
//, TRANSACTION, //TODO add them back
rows.addAll(arrayListOf(CUSTOM_FIELD, BANKROLL, GAME, LOCATION, TOURNAMENT_NAME, TOURNAMENT_FEATURE, TRANSACTION_TYPE))
rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.terms))
rows.addAll(arrayListOf(PRIVACY_POLICY, TERMS_OF_USE, GDPR))
@ -106,6 +106,7 @@ enum class SettingRow : RowRepresentable {
override val relatedResultsRepresentable: LiveData?
get() {
return when (this) {
CUSTOM_FIELD -> LiveData.CUSTOM_FIELD
BANKROLL -> LiveData.BANKROLL
GAME -> LiveData.GAME
LOCATION -> LiveData.LOCATION

@ -7,6 +7,12 @@
android:title="@string/stop"
app:showAsAction="always" />
<item
android:id="@+id/newCustomField"
android:title="@string/new_custom_field"
android:icon="@drawable/ic_add"
app:showAsAction="never" />
<item
android:id="@+id/restart"
android:title="@string/restart_timer"

Loading…
Cancel
Save