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. 24
      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 package net.pokeranalytics.android.model.realm
import com.google.android.libraries.places.api.model.Place
import io.realm.RealmObject import io.realm.RealmObject
import io.realm.annotations.PrimaryKey import io.realm.annotations.PrimaryKey
import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.Savable
@ -20,6 +21,9 @@ open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource,
// The name of the location // The name of the location
var name: String = "" var name: String = ""
// The readable address of the location
var address: String = ""
// the longitude of the location // the longitude of the location
var longitude: Double? = null var longitude: Double? = null
@ -34,7 +38,7 @@ open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource,
return this.id return this.id
} }
override fun adapterRows(): List<out RowRepresentable>? { override fun adapterRows(): List<RowRepresentable>? {
val rows = ArrayList<RowRepresentable>() val rows = ArrayList<RowRepresentable>()
rows.add(SimpleRow.NAME) rows.add(SimpleRow.NAME)
rows.addAll(LocationRow.values()) rows.addAll(LocationRow.values())
@ -44,6 +48,7 @@ open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource,
override fun stringForRow(row: RowRepresentable): String { override fun stringForRow(row: RowRepresentable): String {
return when (row) { return when (row) {
SimpleRow.NAME -> this.name SimpleRow.NAME -> this.name
LocationRow.ADDRESS -> this.address
else -> return super.stringForRow(row) else -> return super.stringForRow(row)
} }
} }
@ -57,13 +62,26 @@ open class Location : RealmObject(), Savable, StaticRowRepresentableDataSource,
SimpleRow.NAME.resId SimpleRow.NAME.resId
) )
) )
LocationRow.ADDRESS -> data.add(
RowRepresentableEditDescriptor(
this.address,
LocationRow.ADDRESS.resId
)
)
} }
return data return data
} }
override fun updateValue(value: Any?, row: RowRepresentable) { override fun updateValue(value: Any?, row: RowRepresentable) {
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" 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() 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.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.google.android.gms.common.api.ApiException import com.google.android.libraries.places.api.model.PlaceLikelihood
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 io.realm.Realm import io.realm.Realm
import timber.log.Timber import net.pokeranalytics.android.util.LocationManager
import java.util.* import java.util.*
@ -24,6 +21,8 @@ open class PokerAnalyticsActivity : AppCompatActivity() {
} }
private val realm = Realm.getDefaultInstance() private val realm = Realm.getDefaultInstance()
private var askFromPlaces = false
private var currentCallback: ((success: Boolean, places: ArrayList<PlaceLikelihood>) -> Unit)? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -72,64 +71,34 @@ open class PokerAnalyticsActivity : AppCompatActivity() {
/** /**
* Ask for location permission * Ask for location permission
*/ */
fun askForLocationPermission() { private fun askForLocationPermission() {
ActivityCompat.requestPermissions( ActivityCompat.requestPermissions(
this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
PERMISSION_REQUEST_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 * Called when the permission location has been granted
*/ */
open fun locationPermissionGranted() {} open fun locationPermissionGranted() {
if (askFromPlaces) {
askFromPlaces = false
askForPlacesRequest(currentCallback)
}
}
/** /**
* Ask for places request * Ask for places request
*/ */
fun askForPlacesRequest() { fun askForPlacesRequest(callback: ((success: Boolean, places: ArrayList<PlaceLikelihood>) -> Unit)?) {
// 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()
// Call findCurrentPlace and handle the response (first check that the user has granted permission). // Call findCurrentPlace and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
val placeResponse = placesClient.findCurrentPlace(request) LocationManager(this).askForPlacesRequest(callback)
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}")
}
}
}
} else { } else {
askFromPlaces = true
currentCallback = callback
askForLocationPermission() 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.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate 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.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow
import timber.log.Timber
class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, BottomSheetDelegate { class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, BottomSheetDelegate {
private lateinit var parentActivity: PokerAnalyticsActivity
private lateinit var item: RealmObject private lateinit var item: RealmObject
private lateinit var liveDataType: LiveData private lateinit var liveDataType: LiveData
private lateinit var rowRepresentableAdapter: RowRepresentableAdapter private lateinit var rowRepresentableAdapter: RowRepresentableAdapter
@ -60,6 +65,9 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate,
} }
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) {
LocationRow.LOCATE_ME -> PlacePickerManager.create(parentActivity, row, this)
else -> {
BottomSheetFragment.create( BottomSheetFragment.create(
fragmentManager, fragmentManager,
row, row,
@ -67,6 +75,10 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate,
(this.item as RowRepresentableDataSource).editDescriptors(row) (this.item as RowRepresentableDataSource).editDescriptors(row)
) )
} }
}
}
override fun clickOnAdd(row: RowRepresentable) { override fun clickOnAdd(row: RowRepresentable) {
Toast.makeText(requireContext(), "Add new element: $row", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "Add new element: $row", Toast.LENGTH_SHORT).show()
@ -76,7 +88,11 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate,
this.getRealm().executeTransaction { this.getRealm().executeTransaction {
(this.item as Savable).updateValue(value, row) (this.item as Savable).updateValue(value, row)
} }
rowRepresentableAdapter.refreshRow(row) when(row) {
LocationRow.LOCATE_ME -> rowRepresentableAdapter.notifyDataSetChanged()
else -> rowRepresentableAdapter.refreshRow(row)
}
} }
private fun initData() { private fun initData() {
@ -86,9 +102,9 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate,
* Init UI * Init UI
*/ */
private fun initUI() { private fun initUI() {
val activity = activity as PokerAnalyticsActivity parentActivity = activity as PokerAnalyticsActivity
activity.setSupportActionBar(toolbar) parentActivity.setSupportActionBar(toolbar)
activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
setHasOptionsMenu(true) setHasOptionsMenu(true)
val viewManager = LinearLayoutManager(requireContext()) val viewManager = LinearLayoutManager(requireContext())

@ -13,7 +13,9 @@ import kotlinx.android.synthetic.main.fragment_session.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.extensions.SessionState import net.pokeranalytics.android.model.extensions.SessionState
import net.pokeranalytics.android.model.extensions.getState 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.Session
import net.pokeranalytics.android.model.realm.TimeFrame
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
@ -278,11 +280,18 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott
realm.beginTransaction() realm.beginTransaction()
currentSession = realm.createObject(Session::class.java, UUID.randomUUID().toString()) currentSession = realm.createObject(Session::class.java, UUID.randomUUID().toString())
currentSession.type = if (isTournament) Session.Type.TOURNAMENT.ordinal else Session.Type.CASH_GAME.ordinal 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() realm.commitTransaction()
} }
toolbar.title = toolbar.title = if (currentSession.isTournament()) getString(R.string.tournament) else getString(R.string.cash_game)
if (currentSession.isTournament()) getString(R.string.tournament) else getString(R.string.cash_game)
sessionAdapter = RowRepresentableAdapter(currentSession, this) sessionAdapter = RowRepresentableAdapter(currentSession, this)
recyclerView.adapter = sessionAdapter recyclerView.adapter = sessionAdapter

@ -7,26 +7,30 @@ import net.pokeranalytics.android.ui.view.RowViewType
enum class LocationRow : RowRepresentable { enum class LocationRow : RowRepresentable {
LOCATION_STATUS; ADDRESS,
LOCATE_ME;
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {
LOCATION_STATUS -> R.string.short_name ADDRESS -> R.string.address
LOCATE_ME -> R.string.geo_locate
} }
} }
override val viewType: Int override val viewType: Int
get() { get() {
return when (this) { return when (this) {
LOCATION_STATUS -> RowViewType.TITLE.ordinal ADDRESS -> RowViewType.TITLE_VALUE.ordinal
LOCATE_ME -> RowViewType.BUTTON.ordinal
} }
} }
override val bottomSheetType: BottomSheetType override val bottomSheetType: BottomSheetType
get() { get() {
return when (this) { return when (this) {
LOCATION_STATUS -> BottomSheetType.NONE ADDRESS -> BottomSheetType.EDIT_TEXT
LOCATE_ME -> BottomSheetType.NONE
} }
} }

Loading…
Cancel
Save