Sunteți pe pagina 1din 5

package com.yusufemre.

socialhelper

import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationListener
import android.location.LocationManager
import android.os.Build
import android.provider.Settings
import android.support.v4.app.ActivityCompat
import android.support.v4.app.FragmentActivity
import android.os.Bundle
import android.support.v7.app.AlertDialog
import android.widget.Toast

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.BitmapDescriptorFactory
import com.google.android.gms.maps.model.CameraPosition
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.Marker
import com.google.android.gms.maps.model.MarkerOptions
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.yusufemre.socialhelper.model.LocationData

import java.text.SimpleDateFormat
import java.util.ArrayList
import java.util.Date

class MapsActivity2 : FragmentActivity(), OnMapReadyCallback, LocationListener {

private var mMap: GoogleMap? = null

private var currentLocationMaker: Marker? = null


private var currentLocationLatLong: LatLng? = null
private var mDatabase: DatabaseReference? = null

override fun onCreate(savedInstanceState: Bundle?) {


super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps)
// Obtain the SupportMapFragment and get notified when the map is ready to
be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
startGettingLocations()
mDatabase = FirebaseDatabase.getInstance().reference
getMarkers()

/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera.
In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be
prompted to install
* it inside the SupportMapFragment. This method will only be triggered once
the user has
* installed Google Play services and returned to the app.
*/
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap

// Add a marker in Sydney and move the camera


val recife = LatLng(-8.065638, -34.891130)
mMap!!.addMarker(MarkerOptions().position(recife).title("Marcador em
Recife"))

val cameraPosition =
CameraPosition.Builder().zoom(15f).target(recife).build()

mMap!!.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
}

override fun onLocationChanged(location: Location) {

if (currentLocationMaker != null) {
currentLocationMaker!!.remove()
}
//Add marker
currentLocationLatLong = LatLng(location.latitude, location.longitude)
val markerOptions = MarkerOptions()
markerOptions.position(currentLocationLatLong!!)
markerOptions.title("Localização atual")

markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HU
E_BLUE))
currentLocationMaker = mMap!!.addMarker(markerOptions)

//Move to new location


val cameraPosition =
CameraPosition.Builder().zoom(15f).target(currentLocationLatLong).build()
mMap!!.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))

val locationData = LocationData(location.latitude, location.longitude)

mDatabase!!.child("location").child(Date().time.toString()).setValue(locationData)

Toast.makeText(this, "Localização atualizada", Toast.LENGTH_SHORT).show()


getMarkers()
}

private fun findUnAskedPermissions(wanted: ArrayList<String>): ArrayList<*> {


val result = ArrayList<>()

for (perm in wanted) {


if (!hasPermission(perm)) {
result.add(perm)
}
}

return result
}

private fun hasPermission(permission: String): Boolean {


if (canAskPermission()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return checkSelfPermission(permission) ==
PackageManager.PERMISSION_GRANTED
}
}
return true
}

private fun canAskPermission(): Boolean {


return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1
}

fun showSettingsAlert() {
val alertDialog = AlertDialog.Builder(this)
alertDialog.setTitle("GPS desativado!")
alertDialog.setMessage("Ativar GPS?")
alertDialog.setPositiveButton("Sim") { dialog, which ->
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
startActivity(intent)
}

alertDialog.setNegativeButton("Não") { dialog, which -> dialog.cancel() }

alertDialog.show()
}

private fun startGettingLocations() {

val lm = getSystemService(Context.LOCATION_SERVICE) as LocationManager

val isGPS = lm.isProviderEnabled(LocationManager.GPS_PROVIDER)


val isNetwork = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
var canGetLocation = true
val ALL_PERMISSIONS_RESULT = 101
val MIN_DISTANCE_CHANGE_FOR_UPDATES: Long = 10// Distance in meters
val MIN_TIME_BW_UPDATES = (1000 * 10).toLong()// Time in milliseconds

val permissions = ArrayList<String>()


val permissionsToRequest: ArrayList<String>

permissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION)
permissions.add(android.Manifest.permission.ACCESS_COARSE_LOCATION)
permissionsToRequest = findUnAskedPermissions(permissions) as
ArrayList<String>

//Check if GPS and Network are on, if not asks the user to turn on
if (!isGPS && !isNetwork) {
showSettingsAlert()
} else {
// check permissions

// check permissions for later versions


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (permissionsToRequest.size > 0) {
requestPermissions(permissionsToRequest.toTypedArray(),
ALL_PERMISSIONS_RESULT)
canGetLocation = false
}
}
}

//Checks if FINE LOCATION and COARSE Location were granted


if (ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {

Toast.makeText(this, "Permissão negada", Toast.LENGTH_SHORT).show()


return
}

//Starts requesting location updates


if (canGetLocation) {
if (isGPS) {
lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES.toFloat(), this)

} else if (isNetwork) {
// from Network Provider

lm.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES.toFloat(), this)

}
} else {
Toast.makeText(this, "Não é possível obter a localização",
Toast.LENGTH_SHORT).show()
}
}

private fun getMarkers() {

mDatabase!!.child("location").addListenerForSingleValueEvent(
object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
//Get map of users in datasnapshot
if (dataSnapshot.value != null)
getAllLocations((dataSnapshot.value as Map<String,
Any>?)!!)
}

override fun onCancelled(databaseError: DatabaseError) {


//handle databaseError
}
})
}

private fun getAllLocations(locations: Map<String, Any>) {

for ((key, value) in locations) {

val newDate = Date(java.lang.Long.valueOf(key)!!)


val singleLocation = value as Map<*, *>
val latLng = LatLng(singleLocation["latitude"] as Double,
singleLocation["longitude"] as Double)
addGreenMarker(newDate, latLng)

private fun addGreenMarker(newDate: Date, latLng: LatLng) {


val dt = SimpleDateFormat("dd/MM/yyyy hh:mm:ss")
val markerOptions = MarkerOptions()
markerOptions.position(latLng)
markerOptions.title(dt.format(newDate))

markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HU
E_GREEN))
mMap!!.addMarker(markerOptions)
}

override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {

override fun onProviderEnabled(provider: String) {

override fun onProviderDisabled(provider: String) {

}
}

S-ar putea să vă placă și