This commit is contained in:
Sem van der Hoeven
2021-01-06 13:42:26 +01:00
parent 1f53890a4b
commit 98eeba4de1
2 changed files with 55 additions and 11 deletions

View File

@@ -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);

View File

@@ -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();
// }
} }