From 83e50182bb4000e4c4a1e24232134010fd90fed7 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 11 Mar 2019 15:59:54 +0100 Subject: [PATCH 01/18] Remove unnecessary Exception --- .../java/net/pokeranalytics/android/exceptions/Exceptions.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt index c3751f9c..2f391884 100644 --- a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt +++ b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt @@ -7,7 +7,3 @@ class ModelException(message: String) : Exception(message) { class FormattingException(message: String) : Exception(message) { } - -class TypeException(message: String) : Exception(message) { - -} \ No newline at end of file From e2e036546d1ff8a4de9c9631de5ac0bd9d4a6c37 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Mon, 11 Mar 2019 16:00:17 +0100 Subject: [PATCH 02/18] Refactor location management (and EditableDataFragment) --- .../android/model/realm/Location.kt | 53 +------------ .../ui/fragment/EditableDataFragment.kt | 22 ++++-- .../ui/fragment/LocationDataFragment.kt | 76 ++++++++++++++++--- 3 files changed, 81 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index 028e06fa..7ed23424 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -2,20 +2,16 @@ package net.pokeranalytics.android.model.realm import com.google.android.libraries.places.api.model.Place import io.realm.RealmObject -import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Manageable -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.LocationRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import java.util.* -import kotlin.collections.ArrayList -open class Location : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable { +open class Location : RealmObject(), Manageable, RowRepresentable { @PrimaryKey var id = UUID.randomUUID().toString() @@ -32,9 +28,6 @@ open class Location : RealmObject(), Manageable, StaticRowRepresentableDataSourc // the latitude of the location var latitude: Double? = null - @Ignore - var isLookingForPlaces = false - override fun getDisplayName(): String { return this.name } @@ -43,54 +36,12 @@ open class Location : RealmObject(), Manageable, StaticRowRepresentableDataSourc return this.id } - override fun adapterRows(): List? { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(LocationRow.values()) - return rows - } - - override fun stringForRow(row: RowRepresentable): String { - return when (row) { - SimpleRow.NAME -> this.name - LocationRow.ADDRESS -> this.address - else -> return super.stringForRow(row) - } - } - - override fun boolForRow(row: RowRepresentable): Boolean { - return when(row) { - LocationRow.LOCATE_ME -> return isLookingForPlaces - else -> super.boolForRow(row) - } - } - - override fun editDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() - when (row) { - SimpleRow.NAME -> data.add( - RowRepresentableEditDescriptor( - this.name, - SimpleRow.NAME.resId - ) - ) - LocationRow.ADDRESS -> data.add( - RowRepresentableEditDescriptor( - this.address, - LocationRow.ADDRESS.resId - ) - ) - } - return data - } override fun updateValue(value: Any?, row: RowRepresentable) { - when (row) { SimpleRow.NAME -> this.name = value as String? ?: "" LocationRow.ADDRESS -> this.address = value as String? ?: "" LocationRow.LOCATE_ME -> { - isLookingForPlaces = false if (value is Place) { setPlace(value) } @@ -109,7 +60,7 @@ open class Location : RealmObject(), Manageable, StaticRowRepresentableDataSourc /** * Fill the location attributes with a place object */ - fun setPlace(place: Place) { + private fun setPlace(place: Place) { this.name = place.name ?: "" this.address = place.address ?: "" this.latitude = place.latLng?.latitude diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index 992b817a..936a5ab9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -4,7 +4,6 @@ import android.app.Activity.RESULT_OK import android.content.Intent import android.os.Bundle import android.view.* -import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import io.realm.RealmObject @@ -64,7 +63,7 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - BottomSheetFragment.create(fragmentManager, row, this, (this.item as RowRepresentableDataSource).editDescriptors(row)) + BottomSheetFragment.create(fragmentManager, row, this, getDataSource().editDescriptors(row)) } override fun onRowValueChanged(value: Any?, row: RowRepresentable) { @@ -91,6 +90,12 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele } } + /** + * Return the data source + */ + open fun getDataSource(): RowRepresentableDataSource { + return this.item as RowRepresentableDataSource + } /** * Init data @@ -99,21 +104,22 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele if (this.dataType != null) { val proxyItem: RealmObject? = this.liveDataType.getData(this.getRealm(), primaryKey) proxyItem?.let { + //TODO: Localize this.appBar.toolbar.title = "Update ${this.liveDataType.localizedTitle(this.parentActivity).toLowerCase().capitalize()}" isUpdating = true } ?: run { + //TODO: Localize this.appBar.toolbar.title = "New ${this.liveDataType.localizedTitle(this.parentActivity).toLowerCase().capitalize()}" } this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) - this.rowRepresentableAdapter = RowRepresentableAdapter( - (this.item as RowRepresentableDataSource), - this - ) + + val dataSource = getDataSource() + this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) this.recyclerView.adapter = rowRepresentableAdapter // When creating an object, open automatically the keyboard for the first row - if (!isUpdating && this.item is RowRepresentableDataSource) { - val row = (this.item as RowRepresentableDataSource).adapterRows()?.firstOrNull() + if (!isUpdating) { + val row = dataSource.adapterRows()?.firstOrNull() row?.let { onRowSelected(0, it) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt index a4643159..d86f5b13 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt @@ -1,28 +1,81 @@ package net.pokeranalytics.android.ui.fragment -import net.pokeranalytics.android.exceptions.TypeException import net.pokeranalytics.android.model.realm.Location +import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource +import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.helpers.PlacePickerManager import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow +import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow /** * Custom EditableDataFragment to manage the LOCATE_ME case */ -class LocationDataFragment: EditableDataFragment() { +class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataSource { + + // Return the item as a Location object + private val location: Location + get() { + return this.item as Location + } + + // Loader boolean + private var isLookingForPlaces: Boolean = false + + override fun getDataSource(): RowRepresentableDataSource { + return this + } + + override fun adapterRows(): List? { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(LocationRow.values()) + return rows + } + + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> location.name + LocationRow.ADDRESS -> location.address + else -> return super.stringForRow(row) + } + } + + override fun boolForRow(row: RowRepresentable): Boolean { + return when (row) { + LocationRow.LOCATE_ME -> return isLookingForPlaces + else -> super.boolForRow(row) + } + } + + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() + when (row) { + SimpleRow.NAME -> data.add( + RowRepresentableEditDescriptor( + location.name, + SimpleRow.NAME.resId + ) + ) + LocationRow.ADDRESS -> data.add( + RowRepresentableEditDescriptor( + location.address, + LocationRow.ADDRESS.resId + ) + ) + } + return data + } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - when(row) { + when (row) { LocationRow.LOCATE_ME -> { - if (item is Location) { - (item as Location).isLookingForPlaces = true - PlacePickerManager.create(parentActivity, row, this) - rowRepresentableAdapter.refreshRow(row) - } else { - throw TypeException("Need to manage LocationRow.LOCATE_ME for ${item::class.java}") - } + isLookingForPlaces = true + PlacePickerManager.create(parentActivity, row, this) + rowRepresentableAdapter.refreshRow(row) } - else -> super.onRowSelected(position, row, fromAction) + else -> super.onRowSelected(position, row, fromAction) } } @@ -30,6 +83,7 @@ class LocationDataFragment: EditableDataFragment() { super.onRowValueChanged(value, row) when (row) { LocationRow.LOCATE_ME -> { + isLookingForPlaces = false rowRepresentableAdapter.notifyDataSetChanged() } } From 6c1f064d28c3be8885577b12bea045ec2ea0ec35 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:01:13 +0100 Subject: [PATCH 03/18] Update strings --- ...eaderRowRepresentable.kt => TitleRowRepresentable.kt} | 9 ++++----- app/src/main/res/values/strings.xml | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) rename app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/{HeaderRowRepresentable.kt => TitleRowRepresentable.kt} (81%) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TitleRowRepresentable.kt similarity index 81% rename from app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TitleRowRepresentable.kt index 94e274a5..78d09c83 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TitleRowRepresentable.kt @@ -6,14 +6,15 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType /** - * A class to display headers as row representable + * A class to display a title (and a value) as a Row Representable object */ -class HeaderRowRepresentable( +class TitleRowRepresentable( var customViewType: RowViewType? = RowViewType.HEADER_TITLE, override var resId: Int? = null, var title: String? = null, var value: String? = null, - var computedStat: ComputedStat? = null + var computedStat: ComputedStat? = null, + var isSelectable: Boolean? = false ) : RowRepresentable { override fun localizedTitle(context: Context): String { @@ -27,8 +28,6 @@ class HeaderRowRepresentable( return "LOCALISATION NOT FOUND" } - - override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER_TITLE.ordinal } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a19a6f50..d343fa64 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -19,6 +19,7 @@ Hands played Address + Suggestions %s deleted The end date should be after the start date From 1b430cc7503f19d0955b2ab083ba77d47b2d1190 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:01:21 +0100 Subject: [PATCH 04/18] Add loader layout --- app/src/main/res/layout/row_loader.xml | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 app/src/main/res/layout/row_loader.xml diff --git a/app/src/main/res/layout/row_loader.xml b/app/src/main/res/layout/row_loader.xml new file mode 100644 index 00000000..721df4fc --- /dev/null +++ b/app/src/main/res/layout/row_loader.xml @@ -0,0 +1,37 @@ + + + + + + + + + + \ No newline at end of file From cb9df365cd13aa0bab42e5b90268bc4159bcb856 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:17:06 +0100 Subject: [PATCH 05/18] Format code --- .../net/pokeranalytics/android/ui/fragment/SessionFragment.kt | 1 - 1 file changed, 1 deletion(-) 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 a8f0e4c5..2fd7f12e 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 @@ -225,7 +225,6 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate { if (scrollToTop) { recyclerView.smoothScrollToPosition(0) - } } } From ae35ad9cc730303ced5b6f39c4462c0c9eec63e4 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:18:51 +0100 Subject: [PATCH 06/18] Update variables and function access --- .../android/ui/fragment/EditableDataFragment.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index 936a5ab9..245b6dd5 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -34,7 +34,9 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele private var editableMenu: Menu? = null private var dataType: Int? = null private var primaryKey: String? = null - private var isUpdating = false + + var isUpdating = false + var shouldOpenKeyboard = true override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_editable_data, container, false) @@ -118,7 +120,7 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele this.recyclerView.adapter = rowRepresentableAdapter // When creating an object, open automatically the keyboard for the first row - if (!isUpdating) { + if (!isUpdating && shouldOpenKeyboard) { val row = dataSource.adapterRows()?.firstOrNull() row?.let { onRowSelected(0, it) @@ -138,7 +140,7 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele /** * Save data */ - private fun saveData() { + fun saveData() { if ((this.item as Savable).isValidForSave()) { this.getRealm().executeTransaction { val item = it.copyToRealmOrUpdate(this.item) From 7b3a8f44f34a42824733a046d3e3be58119fcff3 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:19:31 +0100 Subject: [PATCH 07/18] Update visibility of function --- .../java/net/pokeranalytics/android/model/realm/Location.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index 7ed23424..12fc27b5 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -60,7 +60,7 @@ open class Location : RealmObject(), Manageable, RowRepresentable { /** * Fill the location attributes with a place object */ - private fun setPlace(place: Place) { + fun setPlace(place: Place) { this.name = place.name ?: "" this.address = place.address ?: "" this.latitude = place.latLng?.latitude From 771b1f9375551b4eb808dc0e8cd7515eced93362 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:20:00 +0100 Subject: [PATCH 08/18] Add hasLocationPermissionGranted & findCurrentLocation --- .../components/PokerAnalyticsActivity.kt | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt index da29643a..e02ebd15 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt @@ -68,6 +68,13 @@ open class PokerAnalyticsActivity : AppCompatActivity() { return realm } + /** + * Return if the location permission has been granted by the user + */ + fun hasLocationPermissionGranted() : Boolean { + return ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED + } + /** * Ask for location permission */ @@ -78,7 +85,6 @@ open class PokerAnalyticsActivity : AppCompatActivity() { ) } - /** * Ask for places request */ @@ -118,4 +124,25 @@ open class PokerAnalyticsActivity : AppCompatActivity() { } } + /** + * Find the current location + */ + fun findCurrentLocation(callback: ((location: Location?) -> Unit)?) { + if (LocationManager(this).databaseContainsLocationsWithCoordinates()) { + if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + LocationManager(this).findNearestLocationFromUser(callback) + } else { + askForLocationPermission { granted -> + if (granted) { + LocationManager(this).findNearestLocationFromUser(callback) + } else { + callback?.invoke(null) + } + } + } + } else { + callback?.invoke(null) + } + } + } \ No newline at end of file From 929dfd24874419c3d6fa0961108ebdcfa9d1f890 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:20:30 +0100 Subject: [PATCH 09/18] Clean file --- .../pokeranalytics/android/ui/fragment/CurrenciesFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt index 3eda8388..6f1185be 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt @@ -1,7 +1,6 @@ package net.pokeranalytics.android.ui.fragment import android.app.Activity -import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -16,7 +15,6 @@ import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRowRepresentable import net.pokeranalytics.android.util.Preferences import java.util.* From 2c1e66a1554bc45defbf26fe5f8ea8dd801d7edc Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:20:57 +0100 Subject: [PATCH 10/18] Update location rows --- .../android/ui/view/rowrepresentable/LocationRow.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt index 188c51b9..960c3bff 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt @@ -8,13 +8,17 @@ import net.pokeranalytics.android.ui.view.RowViewType enum class LocationRow : RowRepresentable { ADDRESS, + LOCATION_PERMISSION_SWITCH, + LOCATION_LOADER, LOCATE_ME; override val resId: Int? get() { return when (this) { ADDRESS -> R.string.address + LOCATION_PERMISSION_SWITCH -> R.string.geo_locate LOCATE_ME -> R.string.geo_locate + LOCATION_LOADER -> null } } @@ -22,7 +26,9 @@ enum class LocationRow : RowRepresentable { get() { return when (this) { ADDRESS -> RowViewType.TITLE_VALUE.ordinal + LOCATION_PERMISSION_SWITCH -> RowViewType.TITLE_SWITCH.ordinal LOCATE_ME -> RowViewType.ROW_BUTTON.ordinal + LOCATION_LOADER -> RowViewType.LOADER.ordinal } } @@ -30,7 +36,9 @@ enum class LocationRow : RowRepresentable { get() { return when (this) { ADDRESS -> BottomSheetType.EDIT_TEXT + LOCATION_PERMISSION_SWITCH -> BottomSheetType.NONE LOCATE_ME -> BottomSheetType.NONE + LOCATION_LOADER -> BottomSheetType.NONE } } From 7ecfc7e680aea2818633b485baa917f978ff9f61 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:21:19 +0100 Subject: [PATCH 11/18] Add findCurrentLocation --- .../android/util/LocationManager.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/app/src/main/java/net/pokeranalytics/android/util/LocationManager.kt b/app/src/main/java/net/pokeranalytics/android/util/LocationManager.kt index a410f1c2..30d974d4 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/LocationManager.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/LocationManager.kt @@ -44,6 +44,8 @@ class LocationManager(private var context: Context) { // Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(context, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { val placeResponse = placesClient.findCurrentPlace(request) + + placeResponse.addOnCompleteListener { task -> val places = ArrayList() if (task.isSuccessful) { @@ -142,7 +144,31 @@ class LocationManager(private var context: Context) { // If we don't have the permission, return null callback?.invoke(null) } + } + /** + * Return the current location of the user + */ + fun findCurrentLocation(callback: ((location: android.location.Location?) -> Unit)?) { + val fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context) + if (ContextCompat.checkSelfPermission(context, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + fusedLocationClient.lastLocation.addOnSuccessListener { location: android.location.Location? -> + // Got last known location. In some rare situations this can be null. + location?.let { currentLocation -> + callback?.invoke(currentLocation) + } ?: run { + // If the current location is null, return null + callback?.invoke(null) + } + + }.addOnCanceledListener { + // If there was a problem during the call to last location, return null + callback?.invoke(null) + } + + } else { + callback?.invoke(null) + } } } \ No newline at end of file From 536c318f0dbb43d0543b226755bef0e97da69777 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:21:56 +0100 Subject: [PATCH 12/18] Refacotr HeaderRowRepresentable & update LocationDataFragment --- .../android/model/realm/Session.kt | 13 +- .../android/ui/fragment/HistoryFragment.kt | 6 +- .../ui/fragment/LocationDataFragment.kt | 157 ++++++++++++++++-- .../android/ui/fragment/StatsFragment.kt | 4 +- .../ui/view/HistorySessionDiffCallback.kt | 14 +- .../android/ui/view/RowViewType.kt | 26 ++- ...ble.kt => CustomizableRowRepresentable.kt} | 2 +- .../ui/view/rowrepresentable/SettingRow.kt | 10 +- 8 files changed, 187 insertions(+), 45 deletions(-) rename app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/{TitleRowRepresentable.kt => CustomizableRowRepresentable.kt} (96%) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 42d91b9d..bf86aea3 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -27,11 +27,10 @@ import net.pokeranalytics.android.ui.adapter.UnmanagedRowRepresentableException import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType -import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.util.* -import timber.log.Timber import java.util.* import java.util.Currency import kotlin.collections.ArrayList @@ -475,7 +474,7 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre when (getState()) { SessionState.STARTED -> { rows.add( - HeaderRowRepresentable( + CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, title = getFormattedDuration(), computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0) @@ -485,7 +484,7 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre } SessionState.PAUSED -> { rows.add( - HeaderRowRepresentable( + CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, resId = R.string.pause, computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0) @@ -495,14 +494,14 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre } SessionState.FINISHED -> { rows.add( - HeaderRowRepresentable( + CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT_BIG, title = getFormattedDuration(), computedStat = ComputedStat(Stat.NETRESULT, result?.net ?: 0.0) ) ) rows.add( - HeaderRowRepresentable( + CustomizableRowRepresentable( RowViewType.HEADER_TITLE_AMOUNT, resId = R.string.hour_rate_without_pauses, computedStat = ComputedStat(Stat.HOURLY_RATE, this.hourlyRate) @@ -513,7 +512,7 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre /* if (!isTournament()) { rows.add( - HeaderRowRepresentable( + CustomizableRowRepresentable( RowViewType.HEADER_TITLE_VALUE, resId = R.string.bankroll_variation, computedStat = ComputedStat(Stat.HOURLY_RATE, 0.0) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index 5cb2b52d..2cf6fd02 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -24,7 +24,7 @@ import net.pokeranalytics.android.ui.view.HistorySessionDiffCallback import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager -import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.util.getMonthAndYear import net.pokeranalytics.android.util.isSameDay import net.pokeranalytics.android.util.isSameMonth @@ -128,7 +128,7 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource if (groupedByDay) { if (!calendar.isSameDay(currentCalendar) || index == 0) { calendar.time = currentCalendar.time - val header = HeaderRowRepresentable( + val header = CustomizableRowRepresentable( customViewType = RowViewType.HEADER_TITLE, title = session.creationDate.longDate() ) @@ -137,7 +137,7 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource } else { if (!calendar.isSameMonth(currentCalendar) || index == 0) { calendar.time = currentCalendar.time - val header = HeaderRowRepresentable( + val header = CustomizableRowRepresentable( customViewType = RowViewType.HEADER_TITLE, title = session.creationDate.getMonthAndYear() ) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt index d86f5b13..b4f4be86 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt @@ -1,13 +1,20 @@ package net.pokeranalytics.android.ui.fragment +import android.os.Bundle +import android.view.View +import com.google.android.libraries.places.api.model.PlaceLikelihood +import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Location import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.helpers.PlacePickerManager import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor +import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable +import timber.log.Timber /** * Custom EditableDataFragment to manage the LOCATE_ME case @@ -22,29 +29,52 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS // Loader boolean private var isLookingForPlaces: Boolean = false + private var placesForRows: HashMap = HashMap() + private var rowPlaces: ArrayList = ArrayList() + private var locationActivated = false + + val rows = ArrayList() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + shouldOpenKeyboard = false + locationActivated = parentActivity.hasLocationPermissionGranted() + + if (isUpdating) { + + // If we update a location, we set the switch to the correct value + locationActivated = location.latitude != null && location.longitude != null + + } else if (locationActivated) { + + // If we create a new location, we try to locate the user by default + isLookingForPlaces = true + getSuggestionsPlaces() + + } + + updateAdapterUI() + } override fun getDataSource(): RowRepresentableDataSource { return this } override fun adapterRows(): List? { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(LocationRow.values()) return rows } override fun stringForRow(row: RowRepresentable): String { return when (row) { SimpleRow.NAME -> location.name - LocationRow.ADDRESS -> location.address else -> return super.stringForRow(row) } } override fun boolForRow(row: RowRepresentable): Boolean { return when (row) { - LocationRow.LOCATE_ME -> return isLookingForPlaces + LocationRow.LOCATION_PERMISSION_SWITCH -> return locationActivated else -> super.boolForRow(row) } } @@ -58,17 +88,19 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS SimpleRow.NAME.resId ) ) - LocationRow.ADDRESS -> data.add( - RowRepresentableEditDescriptor( - location.address, - LocationRow.ADDRESS.resId - ) - ) } return data } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + + // If we click on a location row, save the location + placesForRows[row]?.place?.let { place -> + location.setPlace(place) + saveData() + return + } + when (row) { LocationRow.LOCATE_ME -> { isLookingForPlaces = true @@ -80,11 +112,108 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS } override fun onRowValueChanged(value: Any?, row: RowRepresentable) { - super.onRowValueChanged(value, row) when (row) { - LocationRow.LOCATE_ME -> { + LocationRow.LOCATION_PERMISSION_SWITCH -> { + if (value is Boolean && value != locationActivated) { + rowPlaces.clear() + locationActivated = value + isLookingForPlaces = value + if (value) { + updateAdapterUI() + getSuggestionsPlaces() + } else { + clearCurrentLocation() + updateAdapterUI() + } + } + } + else -> super.onRowValueChanged(value, row) + } + } + + /** + * Clear current location + */ + private fun clearCurrentLocation() { + location.latitude = null + location.longitude = null + } + + /** + * Refresh rows + */ + private fun refreshRows() { + rows.clear() + rows.add(SimpleRow.NAME) + rows.add(LocationRow.LOCATION_PERMISSION_SWITCH) + + if (isLookingForPlaces) { + rows.add(LocationRow.LOCATION_LOADER) + } + + if (locationActivated && rowPlaces.size > 0) { + rows.add(CustomizableRowRepresentable(resId = R.string.suggestions)) + for (row in rowPlaces) { + rows.add(row) + } + } + } + + /** + * Update UI adapter + */ + private fun updateAdapterUI() { + + val currentRowsSize = rows.size + refreshRows() + val newRowsSize = rows.size + + if (currentRowsSize < newRowsSize) { + rowRepresentableAdapter.notifyItemRangeInserted(currentRowsSize, newRowsSize - currentRowsSize) + } else { + rowRepresentableAdapter.notifyItemRangeRemoved(newRowsSize, currentRowsSize - newRowsSize) + } + } + + /** + * Return the places around the user + */ + private fun getSuggestionsPlaces() { + + val maxResults = 5 + + parentActivity.askForPlacesRequest { success, places -> + + if (success) { + // Try to get the location of the user + parentActivity.findCurrentLocation {currentLocation -> + currentLocation?.let { + Timber.d("Current location: ${it.latitude}, ${it.longitude}") + location.latitude = currentLocation.latitude + location.longitude = currentLocation.longitude + } + } + } + + if (success && places.size > 0) { + locationActivated = true + rowPlaces.clear() + placesForRows.clear() + + for ((index, place) in places.withIndex()) { + if (index < maxResults) { + val row = CustomizableRowRepresentable(customViewType = RowViewType.LOCATION_TITLE, title = place.place.name, isSelectable = true) + rowPlaces.add(row) + placesForRows[row] = place + } + } + + isLookingForPlaces = false + updateAdapterUI() + } else { isLookingForPlaces = false - rowRepresentableAdapter.notifyDataSetChanged() + locationActivated = false + updateAdapterUI() } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt index 684a1172..9dbb5c34 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt @@ -16,7 +16,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.SessionObserverFragment import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.util.NULL_TEXT class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSource { @@ -145,7 +145,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc val rows: ArrayList = ArrayList() results.forEach { results -> - rows.add(HeaderRowRepresentable(title = results.group.name)) + rows.add(CustomizableRowRepresentable(title = results.group.name)) results.group.stats?.forEach { stat -> rows.add(StatRepresentable(stat, results.computedStat(stat))) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/HistorySessionDiffCallback.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/HistorySessionDiffCallback.kt index a0badd28..09ecd30a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/HistorySessionDiffCallback.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/HistorySessionDiffCallback.kt @@ -3,7 +3,7 @@ package net.pokeranalytics.android.ui.view import androidx.annotation.Nullable import androidx.recyclerview.widget.DiffUtil import net.pokeranalytics.android.model.realm.Session -import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable class HistorySessionDiffCallback(var newRows: List, var oldRows: List) : DiffUtil.Callback() { @@ -22,9 +22,9 @@ class HistorySessionDiffCallback(var newRows: List, var oldRow val session1 = oldRows[oldItemPosition] as Session val session2 = newRows[newItemPosition] as Session return session1.id == session2.id - } else if (oldRows[oldItemPosition] is HeaderRowRepresentable && newRows[newItemPosition] is HeaderRowRepresentable) { - val header1 = oldRows[oldItemPosition] as HeaderRowRepresentable - val header2 = newRows[newItemPosition] as HeaderRowRepresentable + } else if (oldRows[oldItemPosition] is CustomizableRowRepresentable && newRows[newItemPosition] is CustomizableRowRepresentable) { + val header1 = oldRows[oldItemPosition] as CustomizableRowRepresentable + val header2 = newRows[newItemPosition] as CustomizableRowRepresentable return header1.title == header2.title } @@ -40,9 +40,9 @@ class HistorySessionDiffCallback(var newRows: List, var oldRow return false //session1.id == session2.id - } else if (oldRows[oldItemPosition] is HeaderRowRepresentable && newRows[newItemPosition] is HeaderRowRepresentable) { - val header1 = oldRows[oldItemPosition] as HeaderRowRepresentable - val header2 = newRows[newItemPosition] as HeaderRowRepresentable + } else if (oldRows[oldItemPosition] is CustomizableRowRepresentable && newRows[newItemPosition] is CustomizableRowRepresentable) { + val header1 = oldRows[oldItemPosition] as CustomizableRowRepresentable + val header2 = newRows[newItemPosition] as CustomizableRowRepresentable return header1.title == header2.title } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index c2f01dab..b6b9fcde 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -14,7 +14,7 @@ import kotlinx.android.synthetic.main.row_history_session.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter -import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable /** * An interface used to factor the configuration of RecyclerView.ViewHolder @@ -35,6 +35,7 @@ enum class RowViewType(private var layoutRes: Int) { HEADER_TITLE_VALUE(R.layout.row_header_title_value), HEADER_TITLE_AMOUNT(R.layout.row_header_title_amount), HEADER_TITLE_AMOUNT_BIG(R.layout.row_header_title_amount_big), + LOCATION_TITLE(R.layout.row_title), // Row TITLE(R.layout.row_title), @@ -46,6 +47,7 @@ enum class RowViewType(private var layoutRes: Int) { DATA(R.layout.row_title), BOTTOM_SHEET_DATA(R.layout.row_bottom_sheet_title), TITLE_CHECK(R.layout.row_title_check), + LOADER(R.layout.row_loader), // Custom row ROW_SESSION(R.layout.row_history_session), @@ -66,10 +68,10 @@ enum class RowViewType(private var layoutRes: Int) { return when (this) { // Header Row View Holder - HEADER_TITLE, HEADER_TITLE_VALUE, HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT_BIG -> HeaderViewHolder(layout) + HEADER_TITLE, HEADER_TITLE_VALUE, HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT_BIG, LOCATION_TITLE -> TitleViewHolder(layout) // Row View Holder - TITLE, TITLE_ARROW, TITLE_VALUE, TITLE_VALUE_ARROW, TITLE_GRID, TITLE_SWITCH, TITLE_CHECK, DATA, BOTTOM_SHEET_DATA -> RowViewHolder( + TITLE, TITLE_ARROW, TITLE_VALUE, TITLE_VALUE_ARROW, TITLE_GRID, TITLE_SWITCH, TITLE_CHECK, DATA, BOTTOM_SHEET_DATA, LOADER -> RowViewHolder( layout ) @@ -96,10 +98,10 @@ enum class RowViewType(private var layoutRes: Int) { /** * Display a header */ - inner class HeaderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + inner class TitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { - if (row is HeaderRowRepresentable) { + if (row is CustomizableRowRepresentable) { // Title itemView.findViewById(R.id.title)?.let { @@ -116,6 +118,18 @@ enum class RowViewType(private var layoutRes: Int) { it.text = row.value } } + + // Listener + row.isSelectable?.let { isSelectable -> + if (isSelectable) { + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.findViewById(R.id.container)?.let { + it.setOnClickListener(listener) + } + } + } } } } @@ -199,7 +213,7 @@ enum class RowViewType(private var layoutRes: Int) { itemView.findViewById(R.id.title)?.text = row.localizedTitle(itemView.context) // Value - itemView.findViewById(R.id.value)?.let {view -> + itemView.findViewById(R.id.value)?.let { view -> adapter.dataSource.contentDescriptorForRow(row)?.textFormat?.let { view.text = it.text view.setTextColor(it.getColor(itemView.context)) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TitleRowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomizableRowRepresentable.kt similarity index 96% rename from app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TitleRowRepresentable.kt rename to app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomizableRowRepresentable.kt index 78d09c83..50a23ee9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TitleRowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/CustomizableRowRepresentable.kt @@ -8,7 +8,7 @@ import net.pokeranalytics.android.ui.view.RowViewType /** * A class to display a title (and a value) as a Row Representable object */ -class TitleRowRepresentable( +class CustomizableRowRepresentable( var customViewType: RowViewType? = RowViewType.HEADER_TITLE, override var resId: Int? = null, var title: String? = null, 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 f5e6c690..43502fbe 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 @@ -40,24 +40,24 @@ enum class SettingRow : RowRepresentable { fun getRows(): ArrayList { val rows = ArrayList() - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.information)) + rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.information)) rows.addAll(arrayListOf(VERSION, RATE_APP, CONTACT_US, BUG_REPORT)) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.follow_us)) + rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.follow_us)) rows.addAll(arrayListOf(FOLLOW_US)) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.preferences)) + rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.preferences)) rows.addAll(arrayListOf(CURRENCY)) rows.add( - HeaderRowRepresentable( + CustomizableRowRepresentable( customViewType = RowViewType.HEADER_TITLE, resId = R.string.data_management ) ) rows.addAll(arrayListOf(BANKROLL, GAME, LOCATION, TOURNAMENT_NAME, TOURNAMENT_FEATURE)) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.terms)) + rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.terms)) rows.addAll(arrayListOf(PRIVACY_POLICY, TERMS_OF_USE, GDPR)) return rows From 997b486e97d2081f70a72c23b6042e0735a53060 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:23:19 +0100 Subject: [PATCH 13/18] Clean LocationRow --- .../android/ui/view/rowrepresentable/LocationRow.kt | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt index 960c3bff..6440e2f6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt @@ -7,17 +7,13 @@ import net.pokeranalytics.android.ui.view.RowViewType enum class LocationRow : RowRepresentable { - ADDRESS, LOCATION_PERMISSION_SWITCH, - LOCATION_LOADER, - LOCATE_ME; + LOCATION_LOADER; override val resId: Int? get() { return when (this) { - ADDRESS -> R.string.address LOCATION_PERMISSION_SWITCH -> R.string.geo_locate - LOCATE_ME -> R.string.geo_locate LOCATION_LOADER -> null } } @@ -25,9 +21,7 @@ enum class LocationRow : RowRepresentable { override val viewType: Int get() { return when (this) { - ADDRESS -> RowViewType.TITLE_VALUE.ordinal LOCATION_PERMISSION_SWITCH -> RowViewType.TITLE_SWITCH.ordinal - LOCATE_ME -> RowViewType.ROW_BUTTON.ordinal LOCATION_LOADER -> RowViewType.LOADER.ordinal } } @@ -35,9 +29,7 @@ enum class LocationRow : RowRepresentable { override val bottomSheetType: BottomSheetType get() { return when (this) { - ADDRESS -> BottomSheetType.EDIT_TEXT LOCATION_PERMISSION_SWITCH -> BottomSheetType.NONE - LOCATE_ME -> BottomSheetType.NONE LOCATION_LOADER -> BottomSheetType.NONE } } From 1faea0857451b43076e54dbdf7956ea06b076a3f Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Tue, 12 Mar 2019 11:32:21 +0100 Subject: [PATCH 14/18] Clean file --- .../android/model/realm/Location.kt | 7 ------- .../ui/fragment/LocationDataFragment.kt | 18 ++++-------------- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index 12fc27b5..de04bfb6 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -6,7 +6,6 @@ import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import java.util.* @@ -40,12 +39,6 @@ open class Location : RealmObject(), Manageable, RowRepresentable { override fun updateValue(value: Any?, row: RowRepresentable) { when (row) { SimpleRow.NAME -> this.name = value as String? ?: "" - LocationRow.ADDRESS -> this.address = value as String? ?: "" - LocationRow.LOCATE_ME -> { - if (value is Place) { - setPlace(value) - } - } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt index b4f4be86..27eaaefe 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt @@ -7,13 +7,12 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Location import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource -import net.pokeranalytics.android.ui.helpers.PlacePickerManager import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType +import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow -import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable import timber.log.Timber /** @@ -93,22 +92,13 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - - // If we click on a location row, save the location + // If we click on a location row, save the location (and finish activity) placesForRows[row]?.place?.let { place -> location.setPlace(place) saveData() return } - - when (row) { - LocationRow.LOCATE_ME -> { - isLookingForPlaces = true - PlacePickerManager.create(parentActivity, row, this) - rowRepresentableAdapter.refreshRow(row) - } - else -> super.onRowSelected(position, row, fromAction) - } + super.onRowSelected(position, row, fromAction) } override fun onRowValueChanged(value: Any?, row: RowRepresentable) { @@ -196,7 +186,6 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS } if (success && places.size > 0) { - locationActivated = true rowPlaces.clear() placesForRows.clear() @@ -208,6 +197,7 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS } } + locationActivated = true isLookingForPlaces = false updateAdapterUI() } else { From 7d4565fc549bd572e8fc88e322c58a664d5af2b0 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 12 Mar 2019 12:19:44 +0100 Subject: [PATCH 15/18] wip adapterrows update, fix issue with tournamentFeature and useCount --- .../pokeranalytics/android/model/LiveData.kt | 2 +- .../model/extensions/SessionExtensions.kt | 2 +- .../model/interfaces/CountableUsage.kt | 2 +- .../android/model/realm/Bankroll.kt | 14 ++++--- .../android/model/realm/Session.kt | 42 ++++++++++++++----- .../android/ui/fragment/SessionFragment.kt | 1 - 6 files changed, 43 insertions(+), 20 deletions(-) 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 6cf7c826..a6979295 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -41,7 +41,7 @@ enum class LiveData : Localizable { realm.executeTransaction { realmResults.forEach { countableUsage -> (countableUsage as CountableUsage).useCount = it.where().equalTo( - "${relatedEntity.simpleName.toLowerCase()}.id", + "${relatedEntity.simpleName.decapitalize()}.id", countableUsage.uniqueIdentifier() ).count().toInt() } diff --git a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt index 5b335cfa..02d9495b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt @@ -43,4 +43,4 @@ fun Session.getState(): SessionState { } } -} +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/CountableUsage.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/CountableUsage.kt index fcfc8db7..3d03abdb 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/CountableUsage.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/CountableUsage.kt @@ -6,5 +6,5 @@ package net.pokeranalytics.android.model.interfaces interface CountableUsage : Identifiable { var useCount: Int get() { return 0 } - set(newValue) {} + set(_) {} } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index 94249270..80ee155a 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -11,6 +11,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow +import timber.log.Timber import java.util.* import kotlin.collections.ArrayList @@ -22,6 +23,13 @@ open class Bankroll(name: String = "") : RealmObject(), Manageable, var bankroll: Bankroll = Bankroll() return bankroll } + + val rowRepresentation : List by lazy { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(BankrollRow.values()) + rows + } } @PrimaryKey @@ -48,12 +56,8 @@ open class Bankroll(name: String = "") : RealmObject(), Manageable, } // Row Representable Datasource - override fun adapterRows(): List? { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(BankrollRow.values()) - return rows + return Bankroll.rowRepresentation } override fun stringForRow(row: RowRepresentable): String { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 5902c670..f416e27b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -36,6 +36,8 @@ import timber.log.Timber import java.util.* import java.util.Currency import kotlin.collections.ArrayList +import kotlin.properties.Delegates +import kotlin.reflect.KProperty open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepresentableDataSource, RowRepresentable, Timed { @@ -110,6 +112,11 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre * The start date of the break */ override var pauseDate: Date? = null + set(value) { + field = value + this.updateRowRepresentation() + } + // The time frame of the Session, i.e. the start & end date // var timeFrame: TimeFrame? = null @@ -186,6 +193,7 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre } else if (this.sessionSet != null) { SessionSetManager.removeFromTimeline(this) } + this.updateRowRepresentation() } /** @@ -469,7 +477,10 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre return "Session ${this.creationDate}" } - override fun adapterRows(): List? { + @Ignore + private var rowRepresentationForCurrentState : List = this.updatedRowRepresentationForCurrentState() + + fun updatedRowRepresentationForCurrentState(): List { val rows = ArrayList() // Headers @@ -512,16 +523,16 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre //TODO V2: Add Bankroll variation /* - if (!isTournament()) { - rows.add( - HeaderRowRepresentable( - RowViewType.HEADER_TITLE_VALUE, - resId = R.string.bankroll_variation, - computedStat = ComputedStat(Stat.HOURLY_RATE, 0.0) - ) - ) - } - */ + if (!isTournament()) { + rows.add( + HeaderRowRepresentable( + RowViewType.HEADER_TITLE_VALUE, + resId = R.string.bankroll_variation, + computedStat = ComputedStat(Stat.HOURLY_RATE, 0.0) + ) + ) + } + */ rows.add(SeparatorRowRepresentable()) } @@ -534,6 +545,15 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre return rows } + fun updateRowRepresentation() { + this.rowRepresentationForCurrentState = this.updatedRowRepresentationForCurrentState() + } + + override fun adapterRows(): List? { + return this.rowRepresentationForCurrentState + + } + override fun boolForRow(row: RowRepresentable): Boolean { return false } 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 a8f0e4c5..1283381d 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 @@ -215,7 +215,6 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate { * Update adapter UI */ private fun updateAdapterUI(scrollToTop: Boolean) { - currentSession.adapterRows()?.let { val diffResult = DiffUtil.calculateDiff(RowRepresentableDiffCallback(it, oldRows)) sessionAdapter.updateRows(diffResult) From 31396f33284f543c7fb73cf7cea1c573484cc5fd Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 12 Mar 2019 12:27:37 +0100 Subject: [PATCH 16/18] clean up fix for tournamentFeatures usecount --- .../pokeranalytics/android/model/LiveData.kt | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) 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 a6979295..bcb1b64f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -40,10 +40,22 @@ enum class LiveData : Localizable { fun setUseCount(realm: Realm, realmResults: RealmResults<*>) { realm.executeTransaction { realmResults.forEach { countableUsage -> - (countableUsage as CountableUsage).useCount = it.where().equalTo( - "${relatedEntity.simpleName.decapitalize()}.id", - countableUsage.uniqueIdentifier() - ).count().toInt() + + when (this) { + TOURNAMENT_FEATURE -> { + (countableUsage as CountableUsage).useCount = it.where().contains( + "tournamentFeatures.id", + countableUsage.uniqueIdentifier() + ).count().toInt() + } + else -> { + (countableUsage as CountableUsage).useCount = it.where().equalTo( + "${relatedEntity.simpleName.decapitalize()}.id", + countableUsage.uniqueIdentifier() + ).count().toInt() + } + } + } } } From fcd5054babe98549eee783e5b36f5b1391518cbd Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 12 Mar 2019 13:32:27 +0100 Subject: [PATCH 17/18] clean up adapterRows to use lazy companion arrays --- .../android/model/realm/Game.kt | 14 ++++-- .../android/model/realm/TournamentFeature.kt | 14 ++++-- .../android/model/realm/TournamentName.kt | 13 +++-- .../android/model/realm/TransactionType.kt | 13 +++-- .../android/ui/fragment/CurrenciesFragment.kt | 49 +++++++++++-------- .../android/ui/fragment/SettingsFragment.kt | 10 ++-- 6 files changed, 73 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index 1bd28aa7..deffc478 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -20,6 +20,15 @@ import kotlin.collections.ArrayList open class Game : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, CountableUsage { + companion object { + val rowRepresentation : List by lazy { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(GameRow.values()) + rows + } + } + @PrimaryKey var id = UUID.randomUUID().toString() @@ -41,10 +50,7 @@ open class Game : RealmObject(), Manageable, StaticRowRepresentableDataSource, R } override fun adapterRows(): List? { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(GameRow.values()) - return rows + return Game.rowRepresentation } override fun stringForRow(row: RowRepresentable): String { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index a21a156e..5df87c36 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -16,6 +16,15 @@ import kotlin.collections.ArrayList open class TournamentFeature : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, CountableUsage { + companion object { + val rowRepresentation : List by lazy { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(TournamentFeatureRow.values()) + rows + } + } + @PrimaryKey var id = UUID.randomUUID().toString() @@ -34,10 +43,7 @@ open class TournamentFeature : RealmObject(), Manageable, StaticRowRepresentable } override fun adapterRows(): List? { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(TournamentFeatureRow.values()) - return rows + return TournamentFeature.rowRepresentation } override fun stringForRow(row: RowRepresentable): String { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt index b76c03fc..9ac3ef1b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt @@ -15,6 +15,14 @@ import kotlin.collections.ArrayList open class TournamentName : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable { + companion object { + val rowRepresentation : List by lazy { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(TournamentNameRow.values()) + rows + } + } @PrimaryKey var id = UUID.randomUUID().toString() @@ -37,10 +45,7 @@ open class TournamentName : RealmObject(), Manageable, StaticRowRepresentableDat } override fun adapterRows(): List? { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(TournamentNameRow.values()) - return rows + return TournamentName.rowRepresentation } override fun stringForRow(row: RowRepresentable): String { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index 87dd38bc..6d38817c 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt @@ -15,6 +15,14 @@ import kotlin.collections.ArrayList open class TransactionType : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable { + companion object { + val rowRepresentation : List by lazy { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(TransactionTypeRow.values()) + rows + } + } @PrimaryKey var id = UUID.randomUUID().toString() @@ -40,10 +48,7 @@ open class TransactionType : RealmObject(), Manageable, StaticRowRepresentableDa } override fun adapterRows(): List? { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(TransactionTypeRow.values()) - return rows + return TransactionType.rowRepresentation } override fun stringForRow(row: RowRepresentable): String { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt index 6f1185be..c94f2ab9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CurrenciesFragment.kt @@ -21,23 +21,34 @@ import java.util.* class CurrenciesFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { - private val mostUsedCurrencyCodes = arrayListOf("EUR", "USD", "CAD", "GBP", "AUD", "CNY") - private val systemCurrencies = Currency.getAvailableCurrencies() - - private val mostUsedCurrencies = this.mostUsedCurrencyCodes.map { code -> - CurrencyRow( - this.systemCurrencies.filter { - it.currencyCode == code - }.first() - ) - } + companion object { + val rowRepresentation : List by lazy { + val rows = ArrayList() + rows.addAll(mostUsedCurrencies) + rows.add(SeparatorRowRepresentable()) + rows.addAll(availableCurrencies) + rows + } + + val mostUsedCurrencyCodes = arrayListOf("EUR", "USD", "CAD", "GBP", "AUD", "CNY") + val systemCurrencies = Currency.getAvailableCurrencies() + - private val availableCurrencies = this.systemCurrencies.filter { - !mostUsedCurrencyCodes.contains(it.currencyCode) - }.sortedBy { - it.displayName - }.map { - CurrencyRow(it) + private val mostUsedCurrencies = this.mostUsedCurrencyCodes.map { code -> + CurrencyRow( + this.systemCurrencies.filter { + it.currencyCode == code + }.first() + ) + } + + private val availableCurrencies = this.systemCurrencies.filter { + !mostUsedCurrencyCodes.contains(it.currencyCode) + }.sortedBy { + it.displayName + }.map { + CurrencyRow(it) + } } private class CurrencyRow(var currency:Currency) : RowRepresentable { @@ -68,11 +79,7 @@ class CurrenciesFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataS // StaticRowRepresentableDataSource override fun adapterRows(): List? { - val rows = ArrayList() - rows.addAll(mostUsedCurrencies) - rows.add(SeparatorRowRepresentable()) - rows.addAll(availableCurrencies) - return rows + return CurrenciesFragment.rowRepresentation } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index e70815bf..d32a4d7c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -40,6 +40,12 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta return fragment } + val rowRepresentation : List by lazy { + val rows = ArrayList() + rows.addAll(SettingRow.getRows()) + rows + } + val REQUEST_CODE_CURRENCY : Int = 0 } @@ -71,9 +77,7 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta } override fun adapterRows(): List? { - val rows = ArrayList() - rows.addAll(SettingRow.getRows()) - return rows + return SettingsFragment.rowRepresentation } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { From 69cd660dc0ebaa35d77efb74852b0cd1752d0399 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 12 Mar 2019 14:19:28 +0100 Subject: [PATCH 18/18] update Identifiable interface to use id variable directly --- .../main/java/net/pokeranalytics/android/model/LiveData.kt | 6 +++--- .../pokeranalytics/android/model/interfaces/Manageable.kt | 2 +- .../net/pokeranalytics/android/model/realm/Bankroll.kt | 6 +----- .../java/net/pokeranalytics/android/model/realm/Game.kt | 6 +----- .../net/pokeranalytics/android/model/realm/Location.kt | 7 +------ .../java/net/pokeranalytics/android/model/realm/Session.kt | 6 +----- .../android/model/realm/TournamentFeature.kt | 6 +----- .../pokeranalytics/android/model/realm/TournamentName.kt | 6 +----- .../pokeranalytics/android/model/realm/TransactionType.kt | 6 +----- .../pokeranalytics/android/ui/fragment/DataListFragment.kt | 2 +- .../android/ui/fragment/EditableDataFragment.kt | 2 +- .../pokeranalytics/android/ui/fragment/HistoryFragment.kt | 2 +- 12 files changed, 14 insertions(+), 43 deletions(-) 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 bcb1b64f..11c2c6a7 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -45,13 +45,13 @@ enum class LiveData : Localizable { TOURNAMENT_FEATURE -> { (countableUsage as CountableUsage).useCount = it.where().contains( "tournamentFeatures.id", - countableUsage.uniqueIdentifier() + countableUsage.id ).count().toInt() } else -> { (countableUsage as CountableUsage).useCount = it.where().equalTo( "${relatedEntity.simpleName.decapitalize()}.id", - countableUsage.uniqueIdentifier() + countableUsage.id ).count().toInt() } } @@ -93,7 +93,7 @@ enum class LiveData : Localizable { } fun deleteData(realm: Realm, data: Manageable) { - realm.where(this.relatedEntity).equalTo("id", data.uniqueIdentifier()).findAll().deleteAllFromRealm() + realm.where(this.relatedEntity).equalTo("id", data.id).findAll().deleteAllFromRealm() } fun updateOrCreate(realm: Realm, primaryKey: String?): RealmObject { diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt index fa848ab3..9c160607 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt @@ -16,7 +16,7 @@ interface Identifiable { /** * A unique identifier getter */ - fun uniqueIdentifier(): String + var id: String } /** diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index 80ee155a..fc2463e3 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -33,7 +33,7 @@ open class Bankroll(name: String = "") : RealmObject(), Manageable, } @PrimaryKey - var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // the name of the bankroll var name: String = name @@ -51,10 +51,6 @@ open class Bankroll(name: String = "") : RealmObject(), Manageable, return this.name } - override fun uniqueIdentifier(): String { - return this.id - } - // Row Representable Datasource override fun adapterRows(): List? { return Bankroll.rowRepresentation diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index deffc478..2161d591 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -30,7 +30,7 @@ open class Game : RealmObject(), Manageable, StaticRowRepresentableDataSource, R } @PrimaryKey - var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // The name of the game var name: String = "" @@ -45,10 +45,6 @@ open class Game : RealmObject(), Manageable, StaticRowRepresentableDataSource, R return this.name } - override fun uniqueIdentifier(): String { - return this.id - } - override fun adapterRows(): List? { return Game.rowRepresentation } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt index de04bfb6..8db529ba 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt @@ -13,7 +13,7 @@ import java.util.* open class Location : RealmObject(), Manageable, RowRepresentable { @PrimaryKey - var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // The name of the location var name: String = "" @@ -31,11 +31,6 @@ open class Location : RealmObject(), Manageable, RowRepresentable { return this.name } - override fun uniqueIdentifier(): String { - return this.id - } - - override fun updateValue(value: Any?, row: RowRepresentable) { when (row) { SimpleRow.NAME -> this.name = value as String? ?: "" diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index c47c1015..9bb6b4d6 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -57,7 +57,7 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre } @PrimaryKey - var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() /** * Indicates the type of session, cash game or tournament @@ -468,10 +468,6 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre @Ignore override val viewType: Int = RowViewType.ROW_SESSION.ordinal - override fun uniqueIdentifier(): String { - return this.id - } - override fun getDisplayName(): String { return "Session ${this.creationDate}" } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index 5df87c36..e5774dc8 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -26,7 +26,7 @@ open class TournamentFeature : RealmObject(), Manageable, StaticRowRepresentable } @PrimaryKey - var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // The name of the feature var name: String = "" @@ -38,10 +38,6 @@ open class TournamentFeature : RealmObject(), Manageable, StaticRowRepresentable return this.name } - override fun uniqueIdentifier(): String { - return this.id - } - override fun adapterRows(): List? { return TournamentFeature.rowRepresentation } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt index 9ac3ef1b..7d149a82 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt @@ -25,7 +25,7 @@ open class TournamentName : RealmObject(), Manageable, StaticRowRepresentableDat } @PrimaryKey - var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // The name of the tournament var name: String = "" @@ -34,10 +34,6 @@ open class TournamentName : RealmObject(), Manageable, StaticRowRepresentableDat return this.name } - override fun uniqueIdentifier(): String { - return this.id - } - override fun updateValue(value: Any?, row: RowRepresentable) { when (row) { SimpleRow.NAME -> this.name = value as String? ?: "" diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index 6d38817c..91a17662 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt @@ -25,7 +25,7 @@ open class TransactionType : RealmObject(), Manageable, StaticRowRepresentableDa } @PrimaryKey - var id = UUID.randomUUID().toString() + override var id = UUID.randomUUID().toString() // The name of the transaction type var name: String = "" @@ -43,10 +43,6 @@ open class TransactionType : RealmObject(), Manageable, StaticRowRepresentableDa return this.name } - override fun uniqueIdentifier(): String { - return this.id - } - override fun adapterRows(): List? { return TransactionType.rowRepresentation } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index c6492cf2..0cf28008 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -70,7 +70,7 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc EditableDataActivity.newInstance( requireContext(), it.ordinal, - (row as Manageable).uniqueIdentifier() + (row as Manageable).id ) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index 245b6dd5..ce7cdcbd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -146,7 +146,7 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele val item = it.copyToRealmOrUpdate(this.item) val uniqueIdentifier = if (item is Identifiable) { - item.uniqueIdentifier() + item.id } else "" finishActivityWithResult(uniqueIdentifier) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index 2cf6fd02..c2a4e7c9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -175,6 +175,6 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - SessionActivity.newInstance(requireContext(), sessionId = (row as Manageable).uniqueIdentifier()) + SessionActivity.newInstance(requireContext(), sessionId = (row as Manageable).id) } } \ No newline at end of file