comments
This commit is contained in:
@@ -45,6 +45,10 @@ public class RouteDetailFragment extends Fragment {
|
|||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Button onclick method that starts the route that is being viewed.
|
||||||
|
* @param view the button
|
||||||
|
*/
|
||||||
public void startRoute(View view) {
|
public void startRoute(View view) {
|
||||||
ApiHandler.INSTANCE.getDirections(route);
|
ApiHandler.INSTANCE.getDirections(route);
|
||||||
RouteHandler.INSTANCE.followRoute(route);
|
RouteHandler.INSTANCE.followRoute(route);
|
||||||
|
|||||||
@@ -20,43 +20,72 @@ import okhttp3.Request;
|
|||||||
import okhttp3.RequestBody;
|
import okhttp3.RequestBody;
|
||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Singleton that handles all API calls
|
||||||
|
*/
|
||||||
public enum ApiHandler {
|
public enum ApiHandler {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
|
|
||||||
private static String TAG = ApiHandler.class.getCanonicalName();
|
private static String TAG = ApiHandler.class.getCanonicalName();
|
||||||
|
|
||||||
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
|
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
|
||||||
private final String BASE_URL = "https://api.openrouteservice.org/v2/directions/";
|
private final String BASE_URL = "https://api.openrouteservice.org/v2/directions/";
|
||||||
private final String API_KEY = "5b3ce3597851110001cf6248d4eee2099f724255918adc71cc502b2a";
|
private final String API_KEY = "5b3ce3597851110001cf6248d4eee2099f724255918adc71cc502b2a";
|
||||||
private final String DIRECTIONS_MODE = "foot-walking";
|
private final String DIRECTIONS_MODE = "foot-walking";
|
||||||
|
|
||||||
private List<DirectionsListener> listeners = new ArrayList<>();
|
private List<DirectionsListener> listeners = new ArrayList<>();
|
||||||
|
|
||||||
private OkHttpClient client = new OkHttpClient();
|
private OkHttpClient client = new OkHttpClient();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets directions from the start location to the end location
|
||||||
|
* @param startLocation the start location
|
||||||
|
* @param endLocation the end location
|
||||||
|
*/
|
||||||
public void getDirections(Location startLocation, Location endLocation) {
|
public void getDirections(Location startLocation, Location endLocation) {
|
||||||
getDirections(startLocation.getCoordinates(),endLocation.getCoordinates());
|
getDirections(startLocation.getCoordinates(),endLocation.getCoordinates());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets directions from the start location latitude and longitude and the end location latitude and longitude
|
||||||
|
* @param startLat the start latitude
|
||||||
|
* @param startLong the start longitude
|
||||||
|
* @param endLat the end latitude
|
||||||
|
* @param endLong the end longitude
|
||||||
|
*/
|
||||||
public void getDirections(double startLat, double startLong, double endLat, double endLong) {
|
public void getDirections(double startLat, double startLong, double endLat, double endLong) {
|
||||||
getDirections(startLong + "," + startLat, endLong + "," + endLat);
|
getDirections(startLong + "," + startLat, endLong + "," + endLat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the directions from the start location to the end location. An example location would be "3.543543,5.7675765"
|
||||||
|
* @param startLocation the start location represented as <i>startlat,startlong</i>
|
||||||
|
* @param endLocation the end location represented as <i>endlat,endlong</i>
|
||||||
|
*/
|
||||||
public void getDirections(String startLocation, String endLocation) {
|
public void getDirections(String startLocation, String endLocation) {
|
||||||
|
|
||||||
|
// build the url
|
||||||
String requestUrl = BASE_URL + DIRECTIONS_MODE + "?api_key=" + API_KEY + "&start=" +startLocation + "&end=" + endLocation;
|
String requestUrl = BASE_URL + DIRECTIONS_MODE + "?api_key=" + API_KEY + "&start=" +startLocation + "&end=" + endLocation;
|
||||||
|
|
||||||
|
// start a new thread to do the request, because we don't want to be networking on our main thread
|
||||||
Thread t = new Thread(() -> {
|
Thread t = new Thread(() -> {
|
||||||
|
|
||||||
|
// build a request from the url
|
||||||
Request request = new Request.Builder().url(requestUrl).build();
|
Request request = new Request.Builder().url(requestUrl).build();
|
||||||
|
|
||||||
|
// try to get the response
|
||||||
try (Response response = client.newCall(request).execute()) {
|
try (Response response = client.newCall(request).execute()) {
|
||||||
if (response.body() != null) {
|
if (response.body() != null) {
|
||||||
String responseString = Objects.requireNonNull(response.body()).string();
|
String responseString = Objects.requireNonNull(response.body()).string();
|
||||||
Log.d(TAG, "getDirections: got response: " + responseString);
|
Log.d(TAG, "getDirections: got response: " + responseString);
|
||||||
|
|
||||||
|
// convert the response into a result object
|
||||||
DirectionsResult result = new DirectionsResult();
|
DirectionsResult result = new DirectionsResult();
|
||||||
result.parse(responseString);
|
result.parse(responseString);
|
||||||
Log.d(TAG, "getDirections: " + result.getSteps().size());
|
Log.d(TAG, "getDirections: " + result.getSteps().size());
|
||||||
|
|
||||||
|
// notify the listeners
|
||||||
for (DirectionsListener listener : listeners) {
|
for (DirectionsListener listener : listeners) {
|
||||||
listener.onDirectionsAvailable(result);
|
listener.onDirectionsAvailable(result);
|
||||||
}
|
}
|
||||||
@@ -77,29 +106,35 @@ public enum ApiHandler {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* adds a listener for when a result of an api call is available
|
||||||
|
* @param listener the new listener
|
||||||
|
*/
|
||||||
public void addListener(DirectionsListener listener) {
|
public void addListener(DirectionsListener listener) {
|
||||||
this.listeners.add(listener);
|
this.listeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets directions for the given {@link Route}
|
||||||
|
* @param route the route to get directions for
|
||||||
|
*/
|
||||||
public void getDirections(Route route) {
|
public void getDirections(Route route) {
|
||||||
// for (int i = 0; i < route.getLocations().size()-1; i+= 2) {
|
|
||||||
// Location start = route.getLocations().get(i);
|
|
||||||
// Location end = route.getLocations().get(i+1);
|
|
||||||
// getDirections(start,end);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
// add the coordinates to the list
|
||||||
ArrayList<double[]> allCoords = new ArrayList<>();
|
ArrayList<double[]> allCoords = new ArrayList<>();
|
||||||
for (Location location : route.getLocations()) {
|
for (Location location : route.getLocations()) {
|
||||||
allCoords.add(location.getCoordinatesAsDoubles());
|
allCoords.add(location.getCoordinatesAsDoubles());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// convert it to a json string
|
||||||
String body = "{\"coordinates\":" + new Gson().toJson(allCoords) + "}";
|
String body = "{\"coordinates\":" + new Gson().toJson(allCoords) + "}";
|
||||||
|
|
||||||
|
|
||||||
String requestUrl = BASE_URL + DIRECTIONS_MODE + "?api_key=" + API_KEY;
|
String requestUrl = BASE_URL + DIRECTIONS_MODE + "?api_key=" + API_KEY;
|
||||||
|
|
||||||
|
// new thread, because we don't want to be networking on our main thread
|
||||||
Thread t = new Thread(() -> {
|
Thread t = new Thread(() -> {
|
||||||
|
|
||||||
|
// add the body to the request
|
||||||
RequestBody requestBody = RequestBody.create(body,JSON);
|
RequestBody requestBody = RequestBody.create(body,JSON);
|
||||||
Request request = new Request.Builder()
|
Request request = new Request.Builder()
|
||||||
.url(requestUrl)
|
.url(requestUrl)
|
||||||
@@ -110,15 +145,19 @@ public enum ApiHandler {
|
|||||||
if (response.body() != null) {
|
if (response.body() != null) {
|
||||||
String responseString = Objects.requireNonNull(response.body()).string();
|
String responseString = Objects.requireNonNull(response.body()).string();
|
||||||
Log.d(TAG, "getDirections: got response: " + responseString);
|
Log.d(TAG, "getDirections: got response: " + responseString);
|
||||||
|
|
||||||
|
// kinda lazy, but we had time pressure
|
||||||
if (responseString.startsWith("{\"error")) {
|
if (responseString.startsWith("{\"error")) {
|
||||||
Log.e(TAG, "getDirections: ERROR IN REQUEST!");
|
Log.e(TAG, "getDirections: ERROR IN REQUEST!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// convert the result into a DirectionsResult
|
||||||
DirectionsResult result = new DirectionsResult();
|
DirectionsResult result = new DirectionsResult();
|
||||||
result.parseRoute(responseString);
|
result.parseRoute(responseString);
|
||||||
Log.d(TAG, "getDirections: " + result.getSteps().size());
|
Log.d(TAG, "getDirections: " + result.getSteps().size());
|
||||||
|
|
||||||
|
//notify the listeners
|
||||||
for (DirectionsListener listener : listeners) {
|
for (DirectionsListener listener : listeners) {
|
||||||
listener.onDirectionsAvailable(result);
|
listener.onDirectionsAvailable(result);
|
||||||
}
|
}
|
||||||
@@ -132,11 +171,12 @@ public enum ApiHandler {
|
|||||||
|
|
||||||
t.start();
|
t.start();
|
||||||
|
|
||||||
try {
|
//
|
||||||
t.join();
|
// try {
|
||||||
} catch (InterruptedException e) {
|
// t.join();
|
||||||
e.printStackTrace();
|
// } catch (InterruptedException e) {
|
||||||
}
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user