You are on page 1of 8

package com.example.

gpstracking;

import android.app.ProgressDialog;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Location;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentActivity;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.FusedLocationProviderApi;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
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.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.appindexing.Indexable;
import com.google.maps.android.SphericalUtil;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class MapsActivity extends FragmentActivity implements


OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
GoogleMap.OnMarkerDragListener,
GoogleMap.OnMapLongClickListener,
View.OnClickListener{

//Our Map
private GoogleMap mMap;
private Location currentLocation;

private FusedLocationProviderApi FusedLocationApi;


private FusedLocationProviderClient fusedLocationProviderClient;

private static final int LOCATION_REQUEST_CODE =101;

//To store longitude and latitude from map


private double longitude;
private double latitude;

//From -> the first coordinate from where we need to calculate the distance
private double fromLongitude;
private double fromLatitude;

//To -> the second coordinate to where we need to calculate the distance
private double toLongitude;
private double toLatitude;

//Google ApiClient
private GoogleApiClient googleApiClient;

//Our buttons
private Button buttonSetTo;
private Button buttonSetFrom;
private Button buttonCalcDistance;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to
be used.
SupportMapFragment mapFragment = (SupportMapFragment)
getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

//Initializing googleapi client


// ATTENTION: This "addApi(AppIndex.API)"was auto-generated to implement
the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
//Initializing googleapi client
googleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();

buttonSetTo = (Button) findViewById(R.id.buttonSetTo);


buttonSetFrom = (Button) findViewById(R.id.buttonSetFrom);
buttonCalcDistance = (Button) findViewById(R.id.buttonCalcDistance);

buttonSetTo.setOnClickListener(this);
buttonSetFrom.setOnClickListener(this);
buttonCalcDistance.setOnClickListener(this);

fusedLocationProviderClient =
LocationServices.getFusedLocationProviderClient(this);
if (ActivityCompat.checkSelfPermission(MapsActivity.this,
android.Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(MapsActivity.this,
android.Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]
{android.Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE);
return;
}
fetchLastLocation();
}

private void fetchLastLocation(){


Task<Location> task = fusedLocationProviderClient.getLastLocation();
task.addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
currentLocation = location;
Toast.makeText(MapsActivity.this,currentLocation.getLatitude()
+" "+currentLocation.getLongitude(),Toast.LENGTH_SHORT).show();
SupportMapFragment supportMapFragment= (SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map);
supportMapFragment.getMapAsync(MapsActivity.this);
}else{
Toast.makeText(MapsActivity.this,"No Location
recorded",Toast.LENGTH_SHORT).show();
}
}
});
}
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
LatLng latLng = new
LatLng(currentLocation.getLatitude(),currentLocation.getLongitude());
//MarkerOptions are used to create a new Marker.You can specify location,
title etc with MarkerOptions
MarkerOptions markerOptions = new
MarkerOptions().position(latLng).title("You are Here");

mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 11));
//Adding the created the marker on the map
mMap.addMarker(markerOptions);

}
@Override
// public Action getAction() {
// return Actions.newView(mMap, longitude);
// }
protected void onStart() {
super.onStart();
/* If you�re logging an action on an item that has already been added to the
index,
you don�t have to add the following update line. See
https://firebase.google.com/docs/app-indexing/android/personal-content#update-
the-index for
adding content to the index */
// FirebaseAppIndex.getInstance().update(getIndexable());
// FirebaseUserActions.getInstance().start(getAction());
}

private Indexable getIndexable() {


return null;
}

@Override
protected void onStop() {
// FirebaseUserActions.getInstance().end(getAction());
super.onStop();
}

private void getCurrentLocation() {


mMap.clear();
//Creating a location object
Location location =
LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
//Getting longitude and latitude
longitude = location.getLongitude();
latitude = location.getLatitude();

//moving the map to location


moveMap();
}
}

//Function to move the map


private void moveMap() {
//Creating a LatLng Object to store Coordinates
LatLng latLng = new LatLng(latitude, longitude);

//Adding marker to map


mMap.addMarker(new MarkerOptions()
.position(latLng) //setting position
.draggable(true) //Making the marker draggable
.title("Current Location")); //Adding a title

//Moving the camera


mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

//Animating the camera


mMap.animateCamera(CameraUpdateFactory.zoomTo(11));
}

public String makeURL (double sourcelat, double sourcelog, double destlat,


double destlog ){
StringBuilder urlString = new StringBuilder();
urlString.append("https://maps.googleapis.com/maps/api/directions/json");
urlString.append("?origin=");// from
urlString.append(Double.toString(sourcelat));
urlString.append(",");
urlString
.append(Double.toString( sourcelog));
urlString.append("&destination=");// to
urlString
.append(Double.toString( destlat));
urlString.append(",");
urlString.append(Double.toString(destlog));
urlString.append("&sensor=false&mode=driving&alternatives=true");
urlString.append("&key=SERVER-KEY");
return urlString.toString();
}

private void getDirection(){


//Getting the URL
String url = makeURL(fromLatitude, fromLongitude, toLatitude, toLongitude);

//Showing a dialog till we get the route


final ProgressDialog loading = ProgressDialog.show(this, "Getting Route",
"Please wait...", false, false);

//Creating a string request


StringRequest stringRequest = new StringRequest(url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
loading.dismiss();
//Calling the method drawPath to draw the path
drawPath(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
loading.dismiss();
}
});

//Adding the request to request queue


RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}

//The parameter is the server response


public void drawPath(String result) {
//Getting both the coordinates
LatLng from = new LatLng(fromLatitude,fromLongitude);
LatLng to = new LatLng(toLatitude,toLongitude);

//Calculating the distance in meters


Double distance = SphericalUtil.computeDistanceBetween(from, to);

//Displaying the distance


Toast.makeText(this,String.valueOf(distance+"
Meters"),Toast.LENGTH_SHORT).show();

try {
//Parsing json
final JSONObject json = new JSONObject(result);
JSONArray routeArray = json.getJSONArray("routes");
JSONObject routes = routeArray.getJSONObject(0);
JSONObject overviewPolylines =
routes.getJSONObject("overview_polyline");
String encodedString = overviewPolylines.getString("points");
List<LatLng> list = decodePoly(encodedString);
Polyline line = mMap.addPolyline(new PolylineOptions()
.addAll(list)
.width(20)
.color(Color.RED)
.geodesic(true)
);

}
catch (JSONException e) {

}
}

private List<LatLng> decodePoly(String encoded) {


List<LatLng> poly = new ArrayList<LatLng>();
int index = 0, len = encoded.length();
int lat = 0, lng = 0;

while (index < len) {


int b, shift = 0, result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lat += dlat;

shift = 0;
result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lng += dlng;

LatLng p = new LatLng( (((double) lat / 1E5)),


(((double) lng / 1E5) ));
poly.add(p);
}

return poly;
}

// @Override
// public void onMapReady(GoogleMap googleMap) {
// mMap = googleMap;
// LatLng latLng = new LatLng(20, 78);
// mMap.addMarker(new MarkerOptions().position(latLng).draggable(true));
// mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// mMap.setOnMarkerDragListener(this);
// mMap.setOnMapLongClickListener(this);
// }
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResult) {
switch (requestCode) {
case LOCATION_REQUEST_CODE:
if (grantResult.length > 0 && grantResult[0] ==
PackageManager.PERMISSION_GRANTED) {
fetchLastLocation();
} else {
Toast.makeText(MapsActivity.this,"Location permission
missing",Toast.LENGTH_SHORT).show();
}
break;

}
}

@Override
public void onConnected(Bundle bundle) {
getCurrentLocation();
}

@Override
public void onConnectionSuspended(int i) {

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

@Override
public void onMapLongClick(LatLng latLng) {
//Clearing all the markers
mMap.clear();
//Adding a new marker to the current pressed position
mMap.addMarker(new MarkerOptions()
.position(latLng)
.draggable(true));

latitude = latLng.latitude;
longitude = latLng.longitude;
}

@Override
public void onMarkerDragStart(Marker marker) {

@Override
public void onMarkerDrag(Marker marker) {

@Override
public void onMarkerDragEnd(Marker marker) {
//Getting the coordinates
latitude = marker.getPosition().latitude;
longitude = marker.getPosition().longitude;
//Moving the map
moveMap();
}

@Override
public void onClick(View v) {
if(v == buttonSetFrom){
fromLatitude = latitude;
fromLongitude = longitude;
Toast.makeText(this,"From set",Toast.LENGTH_SHORT).show();
}

if(v == buttonSetTo){
toLatitude = latitude;
toLongitude = longitude;
Toast.makeText(this,"To set",Toast.LENGTH_SHORT).show();
}

if(v == buttonCalcDistance){
getDirection();
}
}
}

You might also like