Add locate me button for location

feature/top10
Aurelien Hubert 7 years ago
parent 8049ef8628
commit 993c2e0bd4
  1. 30
      app/src/main/java/net/pokeranalytics/android/model/realm/Location.kt
  2. 61
      app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt
  3. 38
      app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt
  4. 13
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt
  5. 12
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.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<out RowRepresentable>? {
override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>()
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
}
}

@ -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<PlaceLikelihood>) -> 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<PlaceLikelihood>) -> 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()
}
}

@ -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 ""

@ -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

@ -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
}
}

Loading…
Cancel
Save