import
android.Manifest
import
android.annotation.SuppressLint
import
android.content.Context
import
android.content.Intent
import
android.content.pm.ApplicationInfo
import
android.content.pm.PackageManager
import
android.location.Location
import
android.location.LocationManager
import
androidx.appcompat.app.AppCompatActivity
import
android.os.Bundle
import
android.os.Looper
import
android.provider.Settings
import
android.widget.Button
import
android.widget.Toast
import
androidx.core.app.ActivityCompat
import
com.google.android.gms.location.*
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.LatLng
import
com.google.android.gms.maps.model.MarkerOptions
import
com.google.android.libraries.places.api.Places
class
MainActivity : AppCompatActivity(), OnMapReadyCallback {
private
val pERMISSION_ID =
42
lateinit var mFusedLocationClient: FusedLocationProviderClient
lateinit var mMap: GoogleMap
var currentLocation: LatLng = LatLng(
20.5
,
78.9
)
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val ai: ApplicationInfo = applicationContext.packageManager
.getApplicationInfo(applicationContext.packageName, PackageManager.GET_META_DATA)
val value = ai.metaData[
"com.google.android.geo.API_KEY"
]
val apiKey = value.toString()
if
(!Places.isInitialized()) {
Places.initialize(applicationContext, apiKey)
}
val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(
this
)
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(
this
)
val btn = findViewById<Button>(R.id.currentLoc)
btn.setOnClickListener {
getLastLocation()
}
}
override fun onMapReady(p0: GoogleMap) {
mMap = p0
getLastLocation()
}
@SuppressLint
(
"MissingPermission"
)
private
fun getLastLocation() {
if
(checkPermissions()) {
if
(isLocationEnabled()) {
mFusedLocationClient.lastLocation.addOnCompleteListener(
this
) { task ->
val location: Location? = task.result
if
(location ==
null
) {
requestNewLocationData()
}
else
{
currentLocation = LatLng(location.latitude, location.longitude)
mMap.clear()
mMap.addMarker(MarkerOptions().position(currentLocation))
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLocation, 16F))
}
}
}
else
{
Toast.makeText(
this
,
"Turn on location"
, Toast.LENGTH_LONG).show()
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
startActivity(intent)
}
}
else
{
requestPermissions()
}
}
@SuppressLint
(
"MissingPermission"
)
private
fun requestNewLocationData() {
val mLocationRequest = LocationRequest()
mLocationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
mLocationRequest.interval =
0
mLocationRequest.fastestInterval =
0
mLocationRequest.numUpdates =
1
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(
this
)
mFusedLocationClient.requestLocationUpdates(
mLocationRequest, mLocationCallback,
Looper.myLooper()
)
}
private
val mLocationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
val mLastLocation: Location = locationResult.lastLocation
currentLocation = LatLng(mLastLocation.latitude, mLastLocation.longitude)
}
}
private
fun isLocationEnabled(): Boolean {
val locationManager: LocationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
return
locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(
LocationManager.NETWORK_PROVIDER
)
}
private
fun checkPermissions(): Boolean {
if
(ActivityCompat.checkSelfPermission(
this
, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(
this
, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
) {
return
true
}
return
false
}
private
fun requestPermissions() {
ActivityCompat.requestPermissions(
this
,
arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION),
pERMISSION_ID
)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
if
(requestCode == pERMISSION_ID) {
if
((grantResults.isNotEmpty() && grantResults[
0
] == PackageManager.PERMISSION_GRANTED)) {
getLastLocation()
}
}
}
}