From d433565fefcda28bce92cbfa81928e5889be8c17 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 4 Jan 2021 11:42:34 +0100 Subject: [PATCH 1/4] added parsing of directions response --- .../com/a1/nextlocation/MainActivity.java | 1 + .../nextlocation/fragments/HomeFragment.java | 2 - .../nextlocation/fragments/RouteFragment.java | 19 ++++++ .../nextlocation/json/DirectionsResult.java | 62 +++++++++++++++++++ .../a1/nextlocation/json/DirectionsStep.java | 40 ++++++++++++ .../a1/nextlocation/network/ApiHandler.java | 36 +++++++---- .../network/DirectionsListener.java | 8 +++ 7 files changed, 153 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java create mode 100644 app/src/main/java/com/a1/nextlocation/json/DirectionsStep.java create mode 100644 app/src/main/java/com/a1/nextlocation/network/DirectionsListener.java diff --git a/app/src/main/java/com/a1/nextlocation/MainActivity.java b/app/src/main/java/com/a1/nextlocation/MainActivity.java index 9ba6645..aa9d618 100644 --- a/app/src/main/java/com/a1/nextlocation/MainActivity.java +++ b/app/src/main/java/com/a1/nextlocation/MainActivity.java @@ -13,6 +13,7 @@ import com.a1.nextlocation.fragments.HomeFragment; import com.a1.nextlocation.fragments.RouteFragment; import com.a1.nextlocation.fragments.SettingsFragment; import com.a1.nextlocation.fragments.StatisticFragment; +import com.a1.nextlocation.network.ApiHandler; import com.a1.nextlocation.recyclerview.CouponListManager; import com.a1.nextlocation.recyclerview.LocationListManager; import com.a1.nextlocation.recyclerview.RouteListManager; diff --git a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java index 8f5ba7d..d21d925 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -110,8 +110,6 @@ public class HomeFragment extends Fragment { mapView.getOverlays().add(customOverlay); - - // add the zoom controller IMapController mapController = mapView.getController(); mapController.setZoom(15.0); diff --git a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java index 59043de..a415247 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java @@ -2,19 +2,27 @@ package com.a1.nextlocation.fragments; import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.a1.nextlocation.R; +import com.a1.nextlocation.json.DirectionsResult; +import com.a1.nextlocation.network.ApiHandler; +import com.a1.nextlocation.network.DirectionsListener; public class RouteFragment extends Fragment { + private static final String TAG = RouteFragment.class.getCanonicalName(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + ApiHandler.INSTANCE.addListener(this::onDirectionsAvailable); } @@ -24,4 +32,15 @@ public class RouteFragment extends Fragment { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_route, container, false); } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + ApiHandler.INSTANCE.getDirections(8.681436,49.41461,8.687872,49.420318); + } + + public void onDirectionsAvailable(DirectionsResult result) { + Log.d(TAG, "onDirectionsAvailable: got result! " + result); + } } \ No newline at end of file diff --git a/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java b/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java new file mode 100644 index 0000000..e52caba --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java @@ -0,0 +1,62 @@ +package com.a1.nextlocation.json; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import java.util.ArrayList; +import java.util.List; + +public class DirectionsResult { + private List steps = new ArrayList<>(); + private double distance; + private double duration; + + public List getSteps() { + return steps; + } + + public void setSteps(List steps) { + this.steps = steps; + } + + public double getDistance() { + return distance; + } + + public void setDistance(double distance) { + this.distance = distance; + } + + public double getDuration() { + return duration; + } + + public void setDuration(double duration) { + this.duration = duration; + } + + public void addStep(DirectionsStep step) { + this.steps.add(step); + } + + public void parse(String json) { + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + JsonObject features = JsonParser.parseString(json).getAsJsonObject().get("features").getAsJsonArray().get(0).getAsJsonObject(); + JsonObject segment = features.get("properties").getAsJsonObject().getAsJsonArray("segments").get(0).getAsJsonObject(); + + setDistance(segment.get("distance").getAsDouble()); + setDuration(segment.get("duration").getAsDouble()); + + JsonArray steps = segment.getAsJsonArray("steps"); + + for (JsonElement j : steps) { + DirectionsStep step = gson.fromJson(j,DirectionsStep.class); + addStep(step); + } + } +} diff --git a/app/src/main/java/com/a1/nextlocation/json/DirectionsStep.java b/app/src/main/java/com/a1/nextlocation/json/DirectionsStep.java new file mode 100644 index 0000000..64678f8 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/json/DirectionsStep.java @@ -0,0 +1,40 @@ +package com.a1.nextlocation.json; + +public class DirectionsStep { + private double distance; + private double duration; + private String instruction; + private String name; + + public double getDistance() { + return distance; + } + + public void setDistance(double distance) { + this.distance = distance; + } + + public double getDuration() { + return duration; + } + + public void setDuration(double duration) { + this.duration = duration; + } + + public String getInstruction() { + return instruction; + } + + public void setInstruction(String instruction) { + this.instruction = instruction; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java b/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java index af34416..0bf76dc 100644 --- a/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java +++ b/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java @@ -4,8 +4,11 @@ import android.util.Log; import com.a1.nextlocation.data.Location; import com.a1.nextlocation.data.Route; +import com.a1.nextlocation.json.DirectionsResult; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; @@ -22,21 +25,22 @@ public enum ApiHandler { 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 API_KEY = "5b3ce3597851110001cf6248d4eee2099f724255918adc71cc502b2a"; - private final String DIRECTIONS_MODE = "foot_walking"; + private final String DIRECTIONS_MODE = "foot-walking"; + private List listeners = new ArrayList<>(); private OkHttpClient client = new OkHttpClient(); - public Route getDirections(Location startLocation, Location endLocation) { - return getDirections(startLocation.getCoordinates(),endLocation.getCoordinates()); + public void getDirections(Location startLocation, Location endLocation) { + getDirections(startLocation.getCoordinates(),endLocation.getCoordinates()); } - public Route getDirections(double startLat, double startLong, double endLat, double endLong) { - return getDirections(startLat + "," + startLong, endLat + "," + endLong); + public void getDirections(double startLat, double startLong, double endLat, double endLong) { + getDirections(startLat + "," + startLong, endLat + "," + endLong); } - public Route getDirections(String startLocation, String endLocation) { + public void getDirections(String startLocation, String endLocation) { + String requestUrl = BASE_URL + DIRECTIONS_MODE + "?api_key=" + API_KEY + "&start=" +startLocation + "&end=" + endLocation; - AtomicReference res = null; Thread t = new Thread(() -> { Request request = new Request.Builder().url(requestUrl).build(); @@ -45,6 +49,14 @@ public enum ApiHandler { if (response.body() != null) { String responseString = Objects.requireNonNull(response.body()).string(); Log.d(TAG, "getDirections: got response: " + responseString); + + DirectionsResult result = new DirectionsResult(); + result.parse(responseString); + Log.d(TAG, "getDirections: " + result.getSteps().size()); + + for (DirectionsListener listener : listeners) { + listener.onDirectionsAvailable(result); + } } } catch (IOException e) { @@ -54,12 +66,10 @@ public enum ApiHandler { t.start(); - try { - t.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return res.get(); + } + + public void addListener(DirectionsListener listener) { + this.listeners.add(listener); } diff --git a/app/src/main/java/com/a1/nextlocation/network/DirectionsListener.java b/app/src/main/java/com/a1/nextlocation/network/DirectionsListener.java new file mode 100644 index 0000000..28f2305 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/network/DirectionsListener.java @@ -0,0 +1,8 @@ +package com.a1.nextlocation.network; + +import com.a1.nextlocation.data.Route; +import com.a1.nextlocation.json.DirectionsResult; + +public interface DirectionsListener { + void onDirectionsAvailable(DirectionsResult result); +} From 96f32ccdbc44b45a079c8953cf84e964953dac64 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 4 Jan 2021 13:50:50 +0100 Subject: [PATCH 2/4] added deserialization of the api response --- app/build.gradle | 6 ++++ .../nextlocation/fragments/RouteFragment.java | 1 + .../nextlocation/json/DirectionsResult.java | 35 +++++++++++++++++-- .../a1/nextlocation/json/DirectionsStep.java | 32 +++++++++++++++++ 4 files changed, 72 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9d6f2cc..84fdfce 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,6 +26,9 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + repositories { + maven { url "https://jitpack.io" } + } } dependencies { @@ -47,6 +50,9 @@ dependencies { //osm implementation 'org.osmdroid:osmdroid-android:6.1.8' + //osm bonus pack + implementation 'com.github.MKergall:osmbonuspack:6.6.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' } \ No newline at end of file diff --git a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java index a415247..8e33968 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java @@ -42,5 +42,6 @@ public class RouteFragment extends Fragment { public void onDirectionsAvailable(DirectionsResult result) { Log.d(TAG, "onDirectionsAvailable: got result! " + result); + } } \ No newline at end of file diff --git a/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java b/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java index e52caba..0282174 100644 --- a/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java +++ b/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java @@ -1,5 +1,7 @@ package com.a1.nextlocation.json; +import android.util.Log; + import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; @@ -7,13 +9,18 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import org.osmdroid.util.GeoPoint; + +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; public class DirectionsResult { + private static final String TAG = DirectionsResult.class.getCanonicalName(); private List steps = new ArrayList<>(); private double distance; private double duration; + private double[][] wayPointCoordinates; public List getSteps() { return steps; @@ -46,8 +53,21 @@ public class DirectionsResult { public void parse(String json) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); - JsonObject features = JsonParser.parseString(json).getAsJsonObject().get("features").getAsJsonArray().get(0).getAsJsonObject(); - JsonObject segment = features.get("properties").getAsJsonObject().getAsJsonArray("segments").get(0).getAsJsonObject(); + JsonObject feature = JsonParser.parseString(json).getAsJsonObject().get("features").getAsJsonArray().get(0).getAsJsonObject(); + JsonObject properties = feature.get("properties").getAsJsonObject(); + JsonArray wayPointCoordinates = feature.get("geometry").getAsJsonObject().getAsJsonArray("coordinates"); + this.wayPointCoordinates = new double[wayPointCoordinates.size()][2]; + + + for (int i = 0; i < wayPointCoordinates.size(); i++) { + JsonElement j = wayPointCoordinates.get(i); + JsonArray arr = j.getAsJsonArray(); + this.wayPointCoordinates[i][0] = arr.get(0).getAsDouble(); + this.wayPointCoordinates[i][1] = arr.get(1).getAsDouble(); + } + + + JsonObject segment = properties.getAsJsonArray("segments").get(0).getAsJsonObject(); setDistance(segment.get("distance").getAsDouble()); setDuration(segment.get("duration").getAsDouble()); @@ -56,7 +76,18 @@ public class DirectionsResult { for (JsonElement j : steps) { DirectionsStep step = gson.fromJson(j,DirectionsStep.class); + double lat; + double longl; + for (int i = 0; i < 2; i++) { + lat = this.wayPointCoordinates[step.getWay_points().get(i)][0]; + longl = this.wayPointCoordinates[step.getWay_points().get(i)][1]; + step.getWaypoints()[i] = new GeoPoint(lat,longl); + } + addStep(step); + Log.d(TAG, "parse: added step" + step); } + + } } diff --git a/app/src/main/java/com/a1/nextlocation/json/DirectionsStep.java b/app/src/main/java/com/a1/nextlocation/json/DirectionsStep.java index 64678f8..c495cef 100644 --- a/app/src/main/java/com/a1/nextlocation/json/DirectionsStep.java +++ b/app/src/main/java/com/a1/nextlocation/json/DirectionsStep.java @@ -1,10 +1,26 @@ package com.a1.nextlocation.json; +import org.osmdroid.util.GeoPoint; + +import java.util.ArrayList; + +/** + * pojo class that holds the step object from the api response + */ public class DirectionsStep { private double distance; private double duration; private String instruction; private String name; + /** + * these are the actual waypoints that the step refers to. The first is the beginning of the step, and the second is what it leads to. + * The second geopoint is always the first geopoint of the next step in the list of the {@link DirectionsResult} object. + */ + private GeoPoint[] waypoints = new GeoPoint[2]; + /** + * this is a list of the waypoints that are in the response, it is called way_points so it can be automatically serialized with gson + */ + private ArrayList way_points; public double getDistance() { return distance; @@ -37,4 +53,20 @@ public class DirectionsStep { public void setName(String name) { this.name = name; } + + public ArrayList getWay_points() { + return way_points; + } + + public void setWay_points(ArrayList way_points) { + this.way_points = way_points; + } + + public GeoPoint[] getWaypoints() { + return waypoints; + } + + public void setWaypoints(GeoPoint[] waypoints) { + this.waypoints = waypoints; + } } From 5e218f3b9991aace947c0d2a666b2ead07d48b87 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 4 Jan 2021 15:20:24 +0100 Subject: [PATCH 3/4] added getting directions for whole route --- .../nextlocation/fragments/RouteFragment.java | 10 +- .../nextlocation/json/DirectionsResult.java | 99 ++++++++++++++++--- .../a1/nextlocation/json/GeometryDecoder.java | 63 ++++++++++++ .../a1/nextlocation/network/ApiHandler.java | 52 ++++++++++ 4 files changed, 209 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/a1/nextlocation/json/GeometryDecoder.java diff --git a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java index 8e33968..d61a62a 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java @@ -12,6 +12,8 @@ import android.view.View; import android.view.ViewGroup; import com.a1.nextlocation.R; +import com.a1.nextlocation.data.Location; +import com.a1.nextlocation.data.Route; import com.a1.nextlocation.json.DirectionsResult; import com.a1.nextlocation.network.ApiHandler; import com.a1.nextlocation.network.DirectionsListener; @@ -37,11 +39,17 @@ public class RouteFragment extends Fragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - ApiHandler.INSTANCE.getDirections(8.681436,49.41461,8.687872,49.420318); +// ApiHandler.INSTANCE.getDirections(8.681436,49.41461,8.687872,49.420318); + Route r = new Route("test"); + r.addLocation(new Location("test",8.681436,49.41461,"route",null)); + r.addLocation(new Location("test",8.687872,49.420318,"route",null)); + ApiHandler.INSTANCE.getDirections(r); } public void onDirectionsAvailable(DirectionsResult result) { Log.d(TAG, "onDirectionsAvailable: got result! " + result); + + } } \ No newline at end of file diff --git a/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java b/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java index 0282174..8cf1c7c 100644 --- a/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java +++ b/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java @@ -8,7 +8,9 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.google.gson.JsonPrimitive; +import org.json.JSONArray; import org.osmdroid.util.GeoPoint; import java.lang.reflect.Array; @@ -50,6 +52,10 @@ public class DirectionsResult { this.steps.add(step); } + /** + * parses a given json string into this object. It gets all the waypoints and steps and combines them so that every step also has the correct coordinates associated with it + * @param json the json string to parse. + */ public void parse(String json) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); @@ -59,6 +65,7 @@ public class DirectionsResult { this.wayPointCoordinates = new double[wayPointCoordinates.size()][2]; + // fill the way point coordinates list for later use for (int i = 0; i < wayPointCoordinates.size(); i++) { JsonElement j = wayPointCoordinates.get(i); JsonArray arr = j.getAsJsonArray(); @@ -67,27 +74,91 @@ public class DirectionsResult { } - JsonObject segment = properties.getAsJsonArray("segments").get(0).getAsJsonObject(); + JsonArray segments = properties.getAsJsonArray("segments"); - setDistance(segment.get("distance").getAsDouble()); - setDuration(segment.get("duration").getAsDouble()); + for (JsonElement element : segments) { + JsonObject segment = element.getAsJsonObject(); - JsonArray steps = segment.getAsJsonArray("steps"); + setDistance(segment.get("distance").getAsDouble()); + setDuration(segment.get("duration").getAsDouble()); - for (JsonElement j : steps) { - DirectionsStep step = gson.fromJson(j,DirectionsStep.class); - double lat; - double longl; - for (int i = 0; i < 2; i++) { - lat = this.wayPointCoordinates[step.getWay_points().get(i)][0]; - longl = this.wayPointCoordinates[step.getWay_points().get(i)][1]; - step.getWaypoints()[i] = new GeoPoint(lat,longl); + JsonArray steps = segment.getAsJsonArray("steps"); + + for (JsonElement j : steps) { + + DirectionsStep step = gson.fromJson(j,DirectionsStep.class); + double lat; + double longl; + + // kinda stinky but it works + for (int i = 0; i < 2; i++) { + lat = this.wayPointCoordinates[step.getWay_points().get(i)][0]; + longl = this.wayPointCoordinates[step.getWay_points().get(i)][1]; + step.getWaypoints()[i] = new GeoPoint(lat,longl); + } + + addStep(step); + Log.d(TAG, "parse: added step" + step); + } + } + + } + + public void parseRoute(String json) { + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + JsonArray routes = JsonParser.parseString(json).getAsJsonObject().getAsJsonArray("routes"); + for (JsonElement element : routes) { + JsonObject route = element.getAsJsonObject(); + JsonObject summary = route.getAsJsonObject("summary"); + this.distance = summary.get("distance").getAsDouble(); + this.duration = summary.get("duration").getAsDouble(); + + JsonPrimitive geometry = route.getAsJsonPrimitive("geometry"); + JsonArray wayPointCoordinates = GeometryDecoder.decodeGeometry(geometry.getAsString(),false); + this.wayPointCoordinates = new double[wayPointCoordinates.size()][2]; + + + // fill the way point coordinates list for later use + for (int i = 0; i < wayPointCoordinates.size(); i++) { + JsonElement j = wayPointCoordinates.get(i); + JsonArray arr = j.getAsJsonArray(); + this.wayPointCoordinates[i][0] = arr.get(0).getAsDouble(); + this.wayPointCoordinates[i][1] = arr.get(1).getAsDouble(); + } + + + JsonArray segments = route.getAsJsonArray("segments"); + + for (JsonElement e : segments) { + JsonObject segment = e.getAsJsonObject(); + + setDistance(segment.get("distance").getAsDouble()); + setDuration(segment.get("duration").getAsDouble()); + + JsonArray steps = segment.getAsJsonArray("steps"); + + for (JsonElement j : steps) { + + DirectionsStep step = gson.fromJson(j,DirectionsStep.class); + double lat; + double longl; + + // kinda stinky but it works + for (int i = 0; i < 2; i++) { + lat = this.wayPointCoordinates[step.getWay_points().get(i)][0]; + longl = this.wayPointCoordinates[step.getWay_points().get(i)][1]; + step.getWaypoints()[i] = new GeoPoint(lat,longl); + } + + addStep(step); + Log.d(TAG, "parse: added step" + step); + } } - addStep(step); - Log.d(TAG, "parse: added step" + step); } + } } diff --git a/app/src/main/java/com/a1/nextlocation/json/GeometryDecoder.java b/app/src/main/java/com/a1/nextlocation/json/GeometryDecoder.java new file mode 100644 index 0000000..3884e52 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/json/GeometryDecoder.java @@ -0,0 +1,63 @@ +package com.a1.nextlocation.json; + +import com.google.gson.JsonArray; + +import org.json.JSONArray; +import org.json.JSONException; + +/** + * source: https://github.com/GIScience/openrouteservice-docs#geometry-decoding + */ +public class GeometryDecoder { + + public static JsonArray decodeGeometry(String encodedGeometry, boolean inclElevation) { + JsonArray geometry = new JsonArray(); + int len = encodedGeometry.length(); + int index = 0; + int lat = 0; + int lng = 0; + int ele = 0; + + while (index < len) { + int result = 1; + int shift = 0; + int b; + do { + b = encodedGeometry.charAt(index++) - 63 - 1; + result += b << shift; + shift += 5; + } while (b >= 0x1f); + lat += (result & 1) != 0 ? ~(result >> 1) : (result >> 1); + + result = 1; + shift = 0; + do { + b = encodedGeometry.charAt(index++) - 63 - 1; + result += b << shift; + shift += 5; + } while (b >= 0x1f); + lng += (result & 1) != 0 ? ~(result >> 1) : (result >> 1); + + + if(inclElevation){ + result = 1; + shift = 0; + do { + b = encodedGeometry.charAt(index++) - 63 - 1; + result += b << shift; + shift += 5; + } while (b >= 0x1f); + ele += (result & 1) != 0 ? ~(result >> 1) : (result >> 1); + } + + JsonArray location = new JsonArray(); + location.add(lat / 1E5); + location.add(lng / 1E5); + if(inclElevation){ + location.add((float) (ele / 100)); + } + geometry.add(location); + } + return geometry; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java b/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java index 0bf76dc..1b480a8 100644 --- a/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java +++ b/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java @@ -5,6 +5,8 @@ import android.util.Log; import com.a1.nextlocation.data.Location; import com.a1.nextlocation.data.Route; import com.a1.nextlocation.json.DirectionsResult; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import java.io.IOException; import java.util.ArrayList; @@ -15,6 +17,7 @@ import java.util.concurrent.atomic.AtomicReference; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; public enum ApiHandler { @@ -72,6 +75,55 @@ public enum ApiHandler { this.listeners.add(listener); } + 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); +// } + + ArrayList allCoords = new ArrayList<>(); + for (Location location : route.getLocations()) { + allCoords.add(location.getCoordinatesAsDoubles()); + } + + String body = "{\"coordinates\":" + new Gson().toJson(allCoords) + "}"; + + + String requestUrl = BASE_URL + DIRECTIONS_MODE + "?api_key=" + API_KEY; + + Thread t = new Thread(() -> { + + RequestBody requestBody = RequestBody.create(body,JSON); + Request request = new Request.Builder() + .url(requestUrl) + .post(requestBody) + .build(); + + try (Response response = client.newCall(request).execute()) { + if (response.body() != null) { + String responseString = Objects.requireNonNull(response.body()).string(); + Log.d(TAG, "getDirections: got response: " + responseString); + + DirectionsResult result = new DirectionsResult(); + result.parseRoute(responseString); + Log.d(TAG, "getDirections: " + result.getSteps().size()); + + for (DirectionsListener listener : listeners) { + listener.onDirectionsAvailable(result); + } + } + + } catch (IOException e) { + Log.d(TAG, "getDirections: caught exception: " + e.getLocalizedMessage()); + } + }); + + t.start(); + + + } + From 9b93ddaec5149324e98c5abb2f0dec10f43aae4d Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Mon, 4 Jan 2021 15:44:47 +0100 Subject: [PATCH 4/4] stuff --- .../java/com/a1/nextlocation/fragments/RouteFragment.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java index d61a62a..3ebe08a 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java @@ -48,8 +48,7 @@ public class RouteFragment extends Fragment { public void onDirectionsAvailable(DirectionsResult result) { Log.d(TAG, "onDirectionsAvailable: got result! " + result); - - - + + } } \ No newline at end of file