Skip to content

Commit

Permalink
Add approximate location radius circle
Browse files Browse the repository at this point in the history
Radius circle shows device's location to within about 1 mile.

Issue #127
  • Loading branch information
englehorn committed Jan 31, 2022
1 parent f759154 commit 2f0d5df
Showing 1 changed file with 49 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,13 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import com.google.android.gms.location.*
import com.google.android.gms.location.LocationRequest.PRIORITY_HIGH_ACCURACY
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.*
import com.google.android.gms.tasks.CancellationTokenSource
import com.google.android.material.bottomappbar.BottomAppBar
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.*
Expand Down Expand Up @@ -118,6 +120,12 @@ class TrafficMapFragment : DaggerFragment(), Injectable, OnMapReadyCallback,
// Camera update task timer
var t: Timer? = null

// Approximate location radius circle
private var radiusCircle: Circle? = null

// Current location cancellation token
private var cancellationTokenSource = CancellationTokenSource()

// FAB
private lateinit var mFab: SpeedDialView

Expand Down Expand Up @@ -1020,6 +1028,7 @@ class TrafficMapFragment : DaggerFragment(), Injectable, OnMapReadyCallback,
@SuppressLint("MissingPermission")
@NeedsPermission(Manifest.permission.ACCESS_FINE_LOCATION)
fun myLocationFine() {
radiusCircle?.remove()
context?.let { context ->
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
fusedLocationClient.lastLocation
Expand All @@ -1036,15 +1045,27 @@ class TrafficMapFragment : DaggerFragment(), Injectable, OnMapReadyCallback,
fun myLocationCoarse() {
context?.let { context ->
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
fusedLocationClient.lastLocation
.addOnSuccessListener { location : Location? ->
mMap.isMyLocationEnabled = false
requestLocationUpdates()
requestGoToLocationUpdate()
fusedLocationClient.getCurrentLocation(PRIORITY_HIGH_ACCURACY, cancellationTokenSource.token).addOnSuccessListener { location : Location? ->
mMap.isMyLocationEnabled = false
if(location != null) {
circle(location)
}
}
requestCoarseLocationUpdate()
}
}

private fun circle(location: Location) {
val circleOptions = CircleOptions()
.center(LatLng(location.latitude, location.longitude))
.radius(location.accuracy.toDouble())
.strokeWidth(5F)
.strokeColor(0x3571cce7)
.fillColor(0x3571cce7)
radiusCircle?.remove()
radiusCircle = mMap.addCircle(circleOptions)
}

private fun checkAppPermissions() {

// API 23 requires fine location alert dialog
Expand Down Expand Up @@ -1095,6 +1116,29 @@ class TrafficMapFragment : DaggerFragment(), Injectable, OnMapReadyCallback,
onRequestPermissionsResult(requestCode, grantResults)
}

@SuppressLint("MissingPermission")
private fun requestCoarseLocationUpdate() {

val locationRequest = LocationRequest()
locationRequest.numUpdates = 1

// Request location update every 60 seconds
locationRequest.interval = 60000

val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
locationResult ?: return
goToUsersLocation(locationResult.lastLocation)
}
}

fusedLocationClient.requestLocationUpdates(
locationRequest,
locationCallback,
Looper.getMainLooper())
}


@SuppressLint("MissingPermission")
private fun requestGoToLocationUpdate() {

Expand Down

0 comments on commit 2f0d5df

Please sign in to comment.