diff --git a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt index 9dc9c928..d82d886f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -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 } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt index 32361079..518285bd 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt @@ -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 by lazy { + val rows = ArrayList() + 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? { + 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().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 + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt index e1a34c27..b3ecc525 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt @@ -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() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index 978c83e2..8d5ef66c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -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 */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt similarity index 96% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt index bdecaa46..d6f9085a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/BankrollEditDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt @@ -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) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt new file mode 100644 index 00000000..95beb10d --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/CustomFieldDataFragment.kt @@ -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? { + 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? { + 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) + } + } + */ + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt similarity index 99% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index 11fef313..58784f62 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -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 diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt similarity index 99% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt index 2fc8c929..61679a7c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/LocationDataFragment.kt @@ -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 diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/TransactionDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt similarity index 98% rename from app/src/main/java/net/pokeranalytics/android/ui/fragment/TransactionDataFragment.kt rename to app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt index 243f2898..faf25b93 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/TransactionDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/TransactionDataFragment.kt @@ -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 diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt new file mode 100644 index 00000000..cea01661 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomFieldRow.kt @@ -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 + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt index 70b497c3..7ded8da5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt @@ -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 diff --git a/app/src/main/res/menu/toolbar_session.xml b/app/src/main/res/menu/toolbar_session.xml index 836a654e..80d24410 100644 --- a/app/src/main/res/menu/toolbar_session.xml +++ b/app/src/main/res/menu/toolbar_session.xml @@ -7,6 +7,12 @@ android:title="@string/stop" app:showAsAction="always" /> + +