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 c721b3e9..f9cf1250 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 @@ -1,5 +1,6 @@ package net.pokeranalytics.android.model.realm +import com.google.android.libraries.places.api.model.Place import io.realm.RealmObject import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable @@ -20,6 +21,9 @@ open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource, // The name of the location var name: String = "" + // The readable address of the location + var address: String = "" + // the longitude of the location var longitude: Double? = null @@ -34,7 +38,7 @@ open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource, return this.id } - override fun adapterRows(): List? { + override fun adapterRows(): List? { val rows = ArrayList() rows.add(SimpleRow.NAME) rows.addAll(LocationRow.values()) @@ -44,6 +48,7 @@ open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource, override fun stringForRow(row: RowRepresentable): String { return when (row) { SimpleRow.NAME -> this.name + LocationRow.ADDRESS -> this.address else -> return super.stringForRow(row) } } @@ -57,13 +62,26 @@ open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource, 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 -> { + if (value is Place) { + setPlace(value) + } + } } } @@ -71,4 +89,14 @@ open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource, return this.name.isNotEmpty() } + /** + * Fill the location attributes with a place object + */ + fun setPlace(place: Place) { + this.name = place.name ?: "" + this.address = place.address ?: "" + this.latitude = place.latLng?.latitude + this.longitude = place.latLng?.longitude + } + } 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 895c1c48..850025de 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 @@ -8,12 +8,9 @@ import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import com.google.android.gms.common.api.ApiException -import com.google.android.libraries.places.api.Places -import com.google.android.libraries.places.api.model.Place -import com.google.android.libraries.places.api.net.FindCurrentPlaceRequest +import com.google.android.libraries.places.api.model.PlaceLikelihood import io.realm.Realm -import timber.log.Timber +import net.pokeranalytics.android.util.LocationManager import java.util.* @@ -24,6 +21,8 @@ open class PokerAnalyticsActivity : AppCompatActivity() { } private val realm = Realm.getDefaultInstance() + private var askFromPlaces = false + private var currentCallback: ((success: Boolean, places: ArrayList) -> Unit)? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -72,64 +71,34 @@ open class PokerAnalyticsActivity : AppCompatActivity() { /** * Ask for location permission */ - fun askForLocationPermission() { + private fun askForLocationPermission() { ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), PERMISSION_REQUEST_ACCESS_FINE_LOCATION ) } - /** - * Return if the user has given the permission location - */ - fun hasLocationPermission(): Boolean { - return ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED - } - /** * Called when the permission location has been granted */ - open fun locationPermissionGranted() {} + open fun locationPermissionGranted() { + if (askFromPlaces) { + askFromPlaces = false + askForPlacesRequest(currentCallback) + } + } /** * Ask for places request */ - fun askForPlacesRequest() { - - // Initialize Places. - Places.initialize(applicationContext, getString(net.pokeranalytics.android.R.string.google_places_api)) - - // Create a new Places client instance. - val placesClient = Places.createClient(this) - - // Use fields to define the data types to return. - val placeFields = Arrays.asList(Place.Field.NAME) - - // Use the builder to create a FindCurrentPlaceRequest. - val request = FindCurrentPlaceRequest.builder(placeFields).build() + fun askForPlacesRequest(callback: ((success: Boolean, places: ArrayList) -> Unit)?) { // Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { - val placeResponse = placesClient.findCurrentPlace(request) - placeResponse.addOnCompleteListener { task -> - if (task.isSuccessful) { - val response = task.result - for (placeLikelihood in response!!.placeLikelihoods) { - Timber.d( - String.format( - "Place '%s' has likelihood: %f", placeLikelihood.place.name, placeLikelihood.likelihood - ) - ) - } - } else { - val exception = task.exception - if (exception is ApiException) { - Timber.d("Error: ${"Place not found: " + exception.statusCode}") - } - } - } - + LocationManager(this).askForPlacesRequest(callback) } else { + askFromPlaces = true + currentCallback = callback askForLocationPermission() } } 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 ffc0c0e6..6fdc7f68 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 @@ -19,13 +19,18 @@ import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate +import net.pokeranalytics.android.ui.fragment.components.PlacePickerManager import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow +import timber.log.Timber + class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, BottomSheetDelegate { + private lateinit var parentActivity: PokerAnalyticsActivity private lateinit var item: RealmObject private lateinit var liveDataType: LiveData private lateinit var rowRepresentableAdapter: RowRepresentableAdapter @@ -60,12 +65,19 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, } override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - BottomSheetFragment.create( - fragmentManager, - row, - this, - (this.item as RowRepresentableDataSource).editDescriptors(row) - ) + when (row) { + LocationRow.LOCATE_ME -> PlacePickerManager.create(parentActivity, row, this) + else -> { + BottomSheetFragment.create( + fragmentManager, + row, + this, + (this.item as RowRepresentableDataSource).editDescriptors(row) + ) + } + } + + } override fun clickOnAdd(row: RowRepresentable) { @@ -76,7 +88,11 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, this.getRealm().executeTransaction { (this.item as Savable).updateValue(value, row) } - rowRepresentableAdapter.refreshRow(row) + when(row) { + LocationRow.LOCATE_ME -> rowRepresentableAdapter.notifyDataSetChanged() + else -> rowRepresentableAdapter.refreshRow(row) + } + } private fun initData() { @@ -86,9 +102,9 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, * Init UI */ private fun initUI() { - val activity = activity as PokerAnalyticsActivity - activity.setSupportActionBar(toolbar) - activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + parentActivity = activity as PokerAnalyticsActivity + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) setHasOptionsMenu(true) val viewManager = LinearLayoutManager(requireContext()) @@ -115,7 +131,7 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, this.getRealm().executeTransaction { val item = it.copyToRealmOrUpdate(this.item) - val uniqueIdentifier = if (item is Identifiable) { + val uniqueIdentifier = if (item is Identifiable) { item.uniqueIdentifier() } else "" 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 28ad02a8..971c85b3 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 @@ -13,7 +13,9 @@ import kotlinx.android.synthetic.main.fragment_session.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.getState +import net.pokeranalytics.android.model.realm.Result import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.model.realm.TimeFrame import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -278,11 +280,18 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott realm.beginTransaction() currentSession = realm.createObject(Session::class.java, UUID.randomUUID().toString()) currentSession.type = if (isTournament) Session.Type.TOURNAMENT.ordinal else Session.Type.CASH_GAME.ordinal + + //TODO: Set default data to the session: bankroll, game, blinds, etc. + //currentSession.bankroll = + //currentSession.game = + //currentSession.limit = + currentSession.timeFrame = TimeFrame() + currentSession.result = Result() + realm.commitTransaction() } - toolbar.title = - if (currentSession.isTournament()) getString(R.string.tournament) else getString(R.string.cash_game) + toolbar.title = if (currentSession.isTournament()) getString(R.string.tournament) else getString(R.string.cash_game) sessionAdapter = RowRepresentableAdapter(currentSession, this) recyclerView.adapter = sessionAdapter 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 2cc89860..6bdd45e2 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,26 +7,30 @@ import net.pokeranalytics.android.ui.view.RowViewType enum class LocationRow : RowRepresentable { - LOCATION_STATUS; + ADDRESS, + LOCATE_ME; override val resId: Int? get() { return when (this) { - LOCATION_STATUS -> R.string.short_name + ADDRESS -> R.string.address + LOCATE_ME -> R.string.geo_locate } } override val viewType: Int get() { return when (this) { - LOCATION_STATUS -> RowViewType.TITLE.ordinal + ADDRESS -> RowViewType.TITLE_VALUE.ordinal + LOCATE_ME -> RowViewType.BUTTON.ordinal } } override val bottomSheetType: BottomSheetType get() { return when (this) { - LOCATION_STATUS -> BottomSheetType.NONE + ADDRESS -> BottomSheetType.EDIT_TEXT + LOCATE_ME -> BottomSheetType.NONE } }