From f2360677061f7ffaa3701355bef63f57184dee2f Mon Sep 17 00:00:00 2001 From: Bart Date: Tue, 5 Jan 2021 10:45:32 +0100 Subject: [PATCH 01/12] Added English string.xml --- app/src/main/res/layout/fragment_settings.xml | 8 +++---- .../main/res/layout/fragment_statistic.xml | 10 ++++----- app/src/main/res/values-en/strings.xml | 17 +++++++++++++++ app/src/main/res/values/strings.xml | 21 ++++++++----------- 4 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 app/src/main/res/values-en/strings.xml diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 6d629eb..3ceecd5 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -45,7 +45,7 @@ + + Location + Total time: + Total distance: + Language + Statistics + Start Route + Routes + Colorblind + Settings + Imperial system + Coupons collected: + Visited locations: + 65+ mode + Coupons + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c322028..9b25e32 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,20 +1,17 @@ - Next Location - - Hello blank fragment + Next Location Locaties Routes Statistieken Instellingen - Taal - Imperiaal systeem - 65+ stand - Kleurenblind - Statistieken - Totale afstand: - Bezochte locaties: - Totale tijd: - Coupons gespaard: + Taal + Imperiaal systeem + 65+ stand + Kleurenblind + Totale afstand: + Bezochte locaties: + Totale tijd: + Coupons gespaard: Coupons Start Route \ No newline at end of file From e8af38981f40af4f5d528613e77073c00a4818a1 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 5 Jan 2021 11:25:13 +0100 Subject: [PATCH 02/12] added visualizing route --- .../a1/nextlocation/data/CurrentRoute.java | 18 ++++++ .../com/a1/nextlocation/data/Location.java | 2 +- .../nextlocation/fragments/HomeFragment.java | 64 ++++++++++++++++--- .../nextlocation/fragments/RouteFragment.java | 22 +++---- .../nextlocation/json/DirectionsResult.java | 40 ++++++++++-- .../a1/nextlocation/network/ApiHandler.java | 18 +++++- app/src/main/res/values/colors.xml | 1 + 7 files changed, 134 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/com/a1/nextlocation/data/CurrentRoute.java diff --git a/app/src/main/java/com/a1/nextlocation/data/CurrentRoute.java b/app/src/main/java/com/a1/nextlocation/data/CurrentRoute.java new file mode 100644 index 0000000..a0642f0 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/data/CurrentRoute.java @@ -0,0 +1,18 @@ +package com.a1.nextlocation.data; + +import org.osmdroid.views.overlay.Polyline; + +public enum CurrentRoute { + INSTANCE; + + private Polyline currentRoute; + + public void setCurrentRoute(Polyline currentRoute) { + this.currentRoute = currentRoute; + } + + public Polyline getCurrentRoute() { + return currentRoute; + } + +} diff --git a/app/src/main/java/com/a1/nextlocation/data/Location.java b/app/src/main/java/com/a1/nextlocation/data/Location.java index f7d2362..e0eb89d 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Location.java +++ b/app/src/main/java/com/a1/nextlocation/data/Location.java @@ -105,7 +105,7 @@ public class Location implements Parcelable { } public static String getStringFromCoordinates(double lat1, double long1) { - return lat1 + "," + long1; + return long1 + "," + lat1; } public GeoPoint convertToGeoPoint() { 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 621d02b..e6dcd75 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -23,31 +23,45 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import com.a1.nextlocation.R; +import com.a1.nextlocation.data.CurrentRoute; import com.a1.nextlocation.data.Route; +import com.a1.nextlocation.json.DirectionsResult; +import com.a1.nextlocation.network.ApiHandler; import com.a1.nextlocation.recyclerview.CouponListManager; import com.a1.nextlocation.recyclerview.CustomOverlay; import com.a1.nextlocation.recyclerview.LocationListManager; import com.a1.nextlocation.recyclerview.RouteListManager; import org.osmdroid.api.IMapController; +import org.osmdroid.bonuspack.routing.MapQuestRoadManager; +import org.osmdroid.bonuspack.routing.OSRMRoadManager; +import org.osmdroid.bonuspack.routing.Road; +import org.osmdroid.bonuspack.routing.RoadManager; import org.osmdroid.config.Configuration; import org.osmdroid.util.GeoPoint; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.Overlay; import org.osmdroid.views.overlay.OverlayItem; +import org.osmdroid.views.overlay.Polyline; import org.osmdroid.views.overlay.compass.CompassOverlay; import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider; import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider; import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; public class HomeFragment extends Fragment { private final String userAgent = "com.ai.nextlocation.fragments"; + public final static String MAPQUEST_API_KEY = "vuyXjqnAADpjeL9QwtgWGleIk95e36My"; private ImageButton imageButton; private MapView mapView; private final int REQUEST_PERMISSIONS_REQUEST_CODE = 1; private final String TAG = HomeFragment.class.getCanonicalName(); + private RoadManager roadManager; + private Polyline roadOverlay; @Override public void onCreate(Bundle savedInstanceState) { @@ -57,6 +71,7 @@ public class HomeFragment extends Fragment { Manifest.permission.ACCESS_FINE_LOCATION, // WRITE_EXTERNAL_STORAGE is required in order to show the map Manifest.permission.WRITE_EXTERNAL_STORAGE); + roadManager = new OSRMRoadManager(requireContext()); } @@ -72,9 +87,25 @@ public class HomeFragment extends Fragment { ((FragmentActivity) view.getContext()).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout, locationFragment).addToBackStack(null).commit(); }); + +// roadManager.addRequestOption("routeType=foot-walking"); + ApiHandler.INSTANCE.addListener(this::onDirectionsAvailable); return view; } + private void onDirectionsAvailable(DirectionsResult directionsResult) { + Log.d(TAG, "onDirectionsAvailable: got result! " + directionsResult); + ArrayList geoPoints = directionsResult.getGeoPoints(); + roadOverlay = new Polyline(); + roadOverlay.setPoints(geoPoints); + roadOverlay.setColor(R.color.red); + + + CurrentRoute.INSTANCE.setCurrentRoute(roadOverlay); + Log.d(TAG, "onDirectionsAvailable: successfully added road!"); + + } + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -106,18 +137,18 @@ public class HomeFragment extends Fragment { mLocationOverlay.enableMyLocation(); mapView.getOverlays().add(mLocationOverlay); - CustomOverlay customOverlay = new CustomOverlay(getResources().getDrawable(R.drawable.ic_baseline_location_on_24),mapView); - - for (com.a1.nextlocation.data.Location l : LocationListManager.INSTANCE.getLocationList()) { - GeoPoint p = new GeoPoint(l.getLat(), l.getLong()); - OverlayItem overlayItem = new OverlayItem(l.getName(),l.getDescription(), p); - - customOverlay.addOverlayItem(overlayItem); - Log.d(TAG, "initMap: " + "succes"); - } +// CustomOverlay customOverlay = new CustomOverlay(getResources().getDrawable(R.drawable.ic_baseline_location_on_24),mapView); +// +// for (com.a1.nextlocation.data.Location l : LocationListManager.INSTANCE.getLocationList()) { +// GeoPoint p = new GeoPoint(l.getLat(), l.getLong()); +// OverlayItem overlayItem = new OverlayItem(l.getName(),l.getDescription(), p); +// +// customOverlay.addOverlayItem(overlayItem); +// Log.d(TAG, "initMap: " + "succes"); +// } - mapView.getOverlays().add(customOverlay); +// mapView.getOverlays().add(customOverlay); // add the zoom controller IMapController mapController = mapView.getController(); @@ -143,6 +174,19 @@ public class HomeFragment extends Fragment { } + if (roadOverlay == null) { + if (CurrentRoute.INSTANCE.getCurrentRoute() != null) { + roadOverlay = CurrentRoute.INSTANCE.getCurrentRoute(); + mapView.getOverlays().add(roadOverlay); + mapView.invalidate(); + Log.d(TAG, "initMap: successfully added road!"); + } + } else { + mapView.getOverlays().add(roadOverlay); + mapView.invalidate(); + Log.d(TAG, "initMap: successfully added road!"); + } + } private void requestPermissionsIfNecessary(String... permissions) { ArrayList permissionsToRequest = new ArrayList<>(); 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 752b7d6..85d8c02 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java @@ -38,7 +38,6 @@ public class RouteFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ApiHandler.INSTANCE.addListener(this::onDirectionsAvailable); } @@ -71,16 +70,15 @@ 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); -// 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); - - + ApiHandler.INSTANCE.getDirections(51.49017262451581, 4.289038164073164,51.47337383133509, 4.303535222390562); + Route r = new Route("test"); + r.addLocation(new Location("test",51.487963606716185, 4.280396603442448,"route",null)); + r.addLocation(new Location("test",51.486962126272886, 4.27884897122147,"route",null)); + r.addLocation(new Location("test",51.485412622620224, 4.277392376189963,"route",null)); + r.addLocation(new Location("test",51.4801212376542, 4.281610432511638,"route",null)); + r.addLocation(new Location("test",51.481103969835665, 4.2903500027691805,"route",null)); +// r.addLocation(new Location("test",51.489063681658145, 4.289596063527951,"route",null)); +// r.addLocation(new Location("test",51.483012677667766, 4.28003245468457,"route",null)); + ApiHandler.INSTANCE.getDirections(r); } } \ 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 8cf1c7c..7f52783 100644 --- a/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java +++ b/app/src/main/java/com/a1/nextlocation/json/DirectionsResult.java @@ -15,6 +15,7 @@ import org.osmdroid.util.GeoPoint; import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class DirectionsResult { @@ -23,6 +24,7 @@ public class DirectionsResult { private double distance; private double duration; private double[][] wayPointCoordinates; + private GeoPoint[] startAndEndPoint = new GeoPoint[2]; public List getSteps() { return steps; @@ -52,8 +54,31 @@ public class DirectionsResult { this.steps.add(step); } + public GeoPoint[] getStartAndEndPoint() { + return startAndEndPoint; + } + + /** + * converts all the geopoints in all the steps into an arraylist to display it on the map + * @return the list of geopoints + */ + public ArrayList getGeoPoints() { + int size = 0; + // we'll have a lot of waypoints, so calculate the size first so that the list won't have to be extended (o p t i m i z e) + for (int i = 0; i < this.getSteps().size(); i++) { + size += this.getSteps().get(i).getWaypoints().length; + } + + ArrayList res = new ArrayList<>(size); + for (DirectionsStep step : this.getSteps()) { + Collections.addAll(res, step.getWaypoints()); + } + return res; + } + /** * 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) { @@ -86,7 +111,7 @@ public class DirectionsResult { for (JsonElement j : steps) { - DirectionsStep step = gson.fromJson(j,DirectionsStep.class); + DirectionsStep step = gson.fromJson(j, DirectionsStep.class); double lat; double longl; @@ -94,7 +119,7 @@ public class DirectionsResult { 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); + step.getWaypoints()[i] = new GeoPoint(lat, longl); } addStep(step); @@ -102,6 +127,9 @@ public class DirectionsResult { } } + startAndEndPoint[0] = this.getSteps().get(0).getWaypoints()[0]; + startAndEndPoint[1] = this.getSteps().get(this.getSteps().size()-1).getWaypoints()[1]; + } public void parseRoute(String json) { @@ -115,7 +143,7 @@ public class DirectionsResult { this.duration = summary.get("duration").getAsDouble(); JsonPrimitive geometry = route.getAsJsonPrimitive("geometry"); - JsonArray wayPointCoordinates = GeometryDecoder.decodeGeometry(geometry.getAsString(),false); + JsonArray wayPointCoordinates = GeometryDecoder.decodeGeometry(geometry.getAsString(), false); this.wayPointCoordinates = new double[wayPointCoordinates.size()][2]; @@ -140,7 +168,7 @@ public class DirectionsResult { for (JsonElement j : steps) { - DirectionsStep step = gson.fromJson(j,DirectionsStep.class); + DirectionsStep step = gson.fromJson(j, DirectionsStep.class); double lat; double longl; @@ -148,7 +176,7 @@ public class DirectionsResult { 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); + step.getWaypoints()[i] = new GeoPoint(lat, longl); } addStep(step); @@ -158,7 +186,5 @@ public class DirectionsResult { } - - } } 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 1b480a8..5787b30 100644 --- a/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java +++ b/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java @@ -38,7 +38,7 @@ public enum ApiHandler { } public void getDirections(double startLat, double startLong, double endLat, double endLong) { - getDirections(startLat + "," + startLong, endLat + "," + endLong); + getDirections(startLong + "," + startLat, endLong + "," + endLat); } public void getDirections(String startLocation, String endLocation) { @@ -69,6 +69,12 @@ public enum ApiHandler { t.start(); +// try { +// t.join(); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } public void addListener(DirectionsListener listener) { @@ -104,6 +110,10 @@ public enum ApiHandler { if (response.body() != null) { String responseString = Objects.requireNonNull(response.body()).string(); Log.d(TAG, "getDirections: got response: " + responseString); + if (responseString.startsWith("{\"error")) { + Log.e(TAG, "getDirections: ERROR IN REQUEST!"); + return; + } DirectionsResult result = new DirectionsResult(); result.parseRoute(responseString); @@ -121,6 +131,12 @@ public enum ApiHandler { t.start(); +// try { +// t.join(); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + } diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cf6f6b1..a8f6080 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,4 +10,5 @@ #FF115571 #FF31AFB4 #FF14212D + #FF0000 \ No newline at end of file From f5f077db0ff6b515ee05785ac5eae58b72ad10c3 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 5 Jan 2021 12:13:42 +0100 Subject: [PATCH 03/12] location stuff --- .../nextlocation/fragments/HomeFragment.java | 65 ++++++++++++++----- .../nextlocation/fragments/RouteFragment.java | 13 ++-- .../a1/nextlocation/network/ApiHandler.java | 10 +-- 3 files changed, 59 insertions(+), 29 deletions(-) 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 e6dcd75..516db24 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -7,6 +7,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; import android.location.Location; +import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; @@ -53,7 +54,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -public class HomeFragment extends Fragment { +public class HomeFragment extends Fragment implements LocationListener { private final String userAgent = "com.ai.nextlocation.fragments"; public final static String MAPQUEST_API_KEY = "vuyXjqnAADpjeL9QwtgWGleIk95e36My"; private ImageButton imageButton; @@ -62,6 +63,9 @@ public class HomeFragment extends Fragment { private final String TAG = HomeFragment.class.getCanonicalName(); private RoadManager roadManager; private Polyline roadOverlay; + private int color; + + private GeoPoint currentLocation; @Override public void onCreate(Bundle savedInstanceState) { @@ -71,8 +75,10 @@ public class HomeFragment extends Fragment { Manifest.permission.ACCESS_FINE_LOCATION, // WRITE_EXTERNAL_STORAGE is required in order to show the map Manifest.permission.WRITE_EXTERNAL_STORAGE); - roadManager = new OSRMRoadManager(requireContext()); + roadManager = new MapQuestRoadManager(MAPQUEST_API_KEY); + roadManager.addRequestOption("routeType=foot-walking"); + color = requireContext().getColor(R.color.red); } @Override @@ -98,7 +104,14 @@ public class HomeFragment extends Fragment { ArrayList geoPoints = directionsResult.getGeoPoints(); roadOverlay = new Polyline(); roadOverlay.setPoints(geoPoints); - roadOverlay.setColor(R.color.red); + + // this is for mapquest, but it gives a "no value for guidancelinkcollection" error and google has never heard of that +// GeoPoint[] gp = directionsResult.getStartAndEndPoint(); +// ArrayList arrayList = new ArrayList<>(Arrays.asList(gp)); +// Road road = roadManager.getRoad(arrayList); +// roadOverlay = RoadManager.buildRoadOverlay(road); + + roadOverlay.setColor(color); CurrentRoute.INSTANCE.setCurrentRoute(roadOverlay); @@ -137,19 +150,6 @@ public class HomeFragment extends Fragment { mLocationOverlay.enableMyLocation(); mapView.getOverlays().add(mLocationOverlay); -// CustomOverlay customOverlay = new CustomOverlay(getResources().getDrawable(R.drawable.ic_baseline_location_on_24),mapView); -// -// for (com.a1.nextlocation.data.Location l : LocationListManager.INSTANCE.getLocationList()) { -// GeoPoint p = new GeoPoint(l.getLat(), l.getLong()); -// OverlayItem overlayItem = new OverlayItem(l.getName(),l.getDescription(), p); -// -// customOverlay.addOverlayItem(overlayItem); -// Log.d(TAG, "initMap: " + "succes"); -// } - - -// mapView.getOverlays().add(customOverlay); - // add the zoom controller IMapController mapController = mapView.getController(); mapController.setZoom(15.0); @@ -158,10 +158,15 @@ public class HomeFragment extends Fragment { LocationManager locationManager = (LocationManager) requireActivity().getSystemService(Context.LOCATION_SERVICE); + try { + + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); - GeoPoint startPoint = new GeoPoint(location.getLatitude(), location.getLongitude()); - mapController.setCenter(startPoint); + if( location != null ) { + currentLocation = new GeoPoint(location.getLatitude(), location.getLongitude()); + mapController.setCenter(currentLocation); + } } catch (SecurityException e) { Log.d(TAG, "onViewCreated: exception while getting location: " + e.getLocalizedMessage()); @@ -205,4 +210,28 @@ public class HomeFragment extends Fragment { REQUEST_PERMISSIONS_REQUEST_CODE); } } + + @Override + public void onLocationChanged(@NonNull Location location) { + + currentLocation = new GeoPoint(location); + IMapController mapController = mapView.getController(); + mapController.animateTo(new GeoPoint(location.getLatitude(),location.getLongitude())); + } + + @Override + public void onProviderEnabled(@NonNull String provider) { + + } + + @Override + public void onProviderDisabled(@NonNull String provider) { + + } + + // this is deprecated but android is stupid and gives an error if I don't override it + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + + } } \ 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 85d8c02..0c1b7b1 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java @@ -70,13 +70,14 @@ public class RouteFragment extends Fragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - ApiHandler.INSTANCE.getDirections(51.49017262451581, 4.289038164073164,51.47337383133509, 4.303535222390562); +// ApiHandler.INSTANCE.getDirections(51.49017262451581, 4.289038164073164,51.47337383133509, 4.303535222390562); Route r = new Route("test"); - r.addLocation(new Location("test",51.487963606716185, 4.280396603442448,"route",null)); - r.addLocation(new Location("test",51.486962126272886, 4.27884897122147,"route",null)); - r.addLocation(new Location("test",51.485412622620224, 4.277392376189963,"route",null)); - r.addLocation(new Location("test",51.4801212376542, 4.281610432511638,"route",null)); - r.addLocation(new Location("test",51.481103969835665, 4.2903500027691805,"route",null)); + r.addLocation(new Location("test",51.574473766034046, 4.7628379328055175,"route",null)); + r.addLocation(new Location("test",51.577354223919876, 4.771120593941968,"route",null)); + r.addLocation(new Location("test",51.573033468635174, 4.782750651807139,"route",null)); + r.addLocation(new Location("test",51.56519104881196, 4.748246716295709,"route",null)); + r.addLocation(new Location("test",51.57367360644676, 4.74404101271347,"route",null)); + r.addLocation(new Location("test",51.57852769146427, 4.739878224473907,"route",null)); // r.addLocation(new Location("test",51.489063681658145, 4.289596063527951,"route",null)); // r.addLocation(new Location("test",51.483012677667766, 4.28003245468457,"route",null)); ApiHandler.INSTANCE.getDirections(r); 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 5787b30..570e683 100644 --- a/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java +++ b/app/src/main/java/com/a1/nextlocation/network/ApiHandler.java @@ -131,11 +131,11 @@ public enum ApiHandler { t.start(); -// try { -// t.join(); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } + try { + t.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } From 40331f31359b0e5e0371dfc11f72b37909fc3154 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 5 Jan 2021 12:59:35 +0100 Subject: [PATCH 04/12] removed test route --- .../nextlocation/fragments/RouteFragment.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 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 0c1b7b1..26c5d31 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/RouteFragment.java @@ -71,15 +71,15 @@ public class RouteFragment extends Fragment { super.onViewCreated(view, savedInstanceState); // ApiHandler.INSTANCE.getDirections(51.49017262451581, 4.289038164073164,51.47337383133509, 4.303535222390562); - Route r = new Route("test"); - r.addLocation(new Location("test",51.574473766034046, 4.7628379328055175,"route",null)); - r.addLocation(new Location("test",51.577354223919876, 4.771120593941968,"route",null)); - r.addLocation(new Location("test",51.573033468635174, 4.782750651807139,"route",null)); - r.addLocation(new Location("test",51.56519104881196, 4.748246716295709,"route",null)); - r.addLocation(new Location("test",51.57367360644676, 4.74404101271347,"route",null)); - r.addLocation(new Location("test",51.57852769146427, 4.739878224473907,"route",null)); -// r.addLocation(new Location("test",51.489063681658145, 4.289596063527951,"route",null)); -// r.addLocation(new Location("test",51.483012677667766, 4.28003245468457,"route",null)); - ApiHandler.INSTANCE.getDirections(r); +// Route r = new Route("test"); +// r.addLocation(new Location("test",51.574473766034046, 4.7628379328055175,"route",null)); +// r.addLocation(new Location("test",51.577354223919876, 4.771120593941968,"route",null)); +// r.addLocation(new Location("test",51.573033468635174, 4.782750651807139,"route",null)); +// r.addLocation(new Location("test",51.56519104881196, 4.748246716295709,"route",null)); +// r.addLocation(new Location("test",51.57367360644676, 4.74404101271347,"route",null)); +// r.addLocation(new Location("test",51.57852769146427, 4.739878224473907,"route",null)); +//// r.addLocation(new Location("test",51.489063681658145, 4.289596063527951,"route",null)); +//// r.addLocation(new Location("test",51.483012677667766, 4.28003245468457,"route",null)); +// ApiHandler.INSTANCE.getDirections(r); } } \ No newline at end of file From 65d2f31e3f1eb8e7dd59e17532dfd666ca5af3ef Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 5 Jan 2021 13:03:42 +0100 Subject: [PATCH 05/12] stuff --- .../a1/nextlocation/fragments/HomeFragment.java | 17 ++++++++++++----- .../fragments/RouteDetailFragment.java | 2 ++ 2 files changed, 14 insertions(+), 5 deletions(-) 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 516db24..f757c11 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -61,7 +61,7 @@ public class HomeFragment extends Fragment implements LocationListener { private MapView mapView; private final int REQUEST_PERMISSIONS_REQUEST_CODE = 1; private final String TAG = HomeFragment.class.getCanonicalName(); - private RoadManager roadManager; +// private RoadManager roadManager; private Polyline roadOverlay; private int color; @@ -75,8 +75,8 @@ public class HomeFragment extends Fragment implements LocationListener { Manifest.permission.ACCESS_FINE_LOCATION, // WRITE_EXTERNAL_STORAGE is required in order to show the map Manifest.permission.WRITE_EXTERNAL_STORAGE); - roadManager = new MapQuestRoadManager(MAPQUEST_API_KEY); - roadManager.addRequestOption("routeType=foot-walking"); +// roadManager = new MapQuestRoadManager(MAPQUEST_API_KEY); +// roadManager.addRequestOption("routeType=foot-walking"); color = requireContext().getColor(R.color.red); } @@ -93,8 +93,6 @@ public class HomeFragment extends Fragment implements LocationListener { ((FragmentActivity) view.getContext()).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout, locationFragment).addToBackStack(null).commit(); }); - -// roadManager.addRequestOption("routeType=foot-walking"); ApiHandler.INSTANCE.addListener(this::onDirectionsAvailable); return view; } @@ -126,6 +124,10 @@ public class HomeFragment extends Fragment implements LocationListener { initMap(view); } + /** + * This method initializes the map and all the things it needs + * @param view the view the map is on + */ private void initMap(@NonNull View view) { // set the user agent Configuration.getInstance().setUserAgentValue(userAgent); @@ -193,6 +195,7 @@ public class HomeFragment extends Fragment implements LocationListener { } } + private void requestPermissionsIfNecessary(String... permissions) { ArrayList permissionsToRequest = new ArrayList<>(); if (this.getContext() != null) @@ -211,6 +214,10 @@ public class HomeFragment extends Fragment implements LocationListener { } } + /** + * animate to the new location + * @param location the new location + */ @Override public void onLocationChanged(@NonNull Location location) { diff --git a/app/src/main/java/com/a1/nextlocation/fragments/RouteDetailFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/RouteDetailFragment.java index d79bfa2..17852b7 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/RouteDetailFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/RouteDetailFragment.java @@ -34,6 +34,8 @@ public class RouteDetailFragment extends Fragment { this.routeDetailText.setText(this.route.getName()); + + return view; } } \ No newline at end of file From fe5a5b6dfd63aecd27825319abf1749074e8cf3f Mon Sep 17 00:00:00 2001 From: Bart Date: Tue, 5 Jan 2021 13:38:21 +0100 Subject: [PATCH 06/12] Added functionality to the dropdown in settings. Language preference is stored in the sharedPreferences --- .../com/a1/nextlocation/MainActivity.java | 28 ++++++ .../fragments/SettingsFragment.java | 89 ++++++++++++++++--- 2 files changed, 107 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/a1/nextlocation/MainActivity.java b/app/src/main/java/com/a1/nextlocation/MainActivity.java index 9f7821e..dc3b7cf 100644 --- a/app/src/main/java/com/a1/nextlocation/MainActivity.java +++ b/app/src/main/java/com/a1/nextlocation/MainActivity.java @@ -5,6 +5,9 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; +import android.app.Activity; +import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Bundle; import android.util.Log; import android.view.MenuItem; @@ -25,6 +28,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView; import java.io.File; import java.util.Arrays; +import java.util.Locale; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getName(); @@ -54,9 +58,33 @@ public class MainActivity extends AppCompatActivity { RouteListManager.INSTANCE.setContext(this); RouteListManager.INSTANCE.load(); + // initialize saved language from sharedPreferences + setLocale(loadLocale()); + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout, new HomeFragment()).commit(); } + /** + * loads the saved language from SharedPreferences + * @return the language as string + */ + private String loadLocale(){ + SharedPreferences sharedPreferences = getSharedPreferences("Settings", Activity.MODE_PRIVATE); + return sharedPreferences.getString("Language", ""); + } + + /** + * sets the language of the application to the desired one + * @param language the desired language + */ + private void setLocale(String language){ + Locale locale = new Locale(language); + Locale.setDefault(locale); + Configuration configuration = new Configuration(); + configuration.setLocale(locale); + getBaseContext().getResources().getConfiguration().updateFrom(configuration); + } + private BottomNavigationView.OnNavigationItemSelectedListener navListener = item -> { Fragment selectedFragment = null; diff --git a/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java index 721ba3e..236ea8c 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java @@ -1,5 +1,8 @@ package com.a1.nextlocation.fragments; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Bundle; import androidx.annotation.NonNull; @@ -9,36 +12,102 @@ import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import com.a1.nextlocation.MainActivity; import com.a1.nextlocation.R; +import java.util.Locale; + public class SettingsFragment extends Fragment { + private SharedPreferences.Editor editor; + private String language; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + editor = getContext().getSharedPreferences("Settings", Context.MODE_PRIVATE).edit(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - return inflater.inflate(R.layout.fragment_settings, container, false); + + View view = inflater.inflate(R.layout.fragment_settings, container, false); + + initializeLanguageDropdown(view); + + return view; } - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - // Inflate the layout for this fragment - Spinner dropdown = view.findViewById(R.id.dropdown_menu_Settings); - + private void initializeLanguageDropdown(View view) { + Spinner languageDropdown = view.findViewById(R.id.dropdown_menu_Settings); String[] items = new String[]{"Nederlands", "Engels", "Chinees"}; ArrayAdapter arrayAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_dropdown_item, items); + languageDropdown.setAdapter(arrayAdapter); - dropdown.setAdapter(arrayAdapter); + // set the language dropdown on the currently selected language stored in the sharedPreferences + languageDropdown.setSelection(languageToDropdownPosition(getContext().getSharedPreferences("Settings", Context.MODE_PRIVATE).getString("Language", ""))); + + languageDropdown.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + setLocale(dropdownPositionToLanguage(position)); + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + } + + /** + * converts the languageDropdown position to the belonging language + * @param position desired position to convert + * @return the language belonging to the position of the languageDropdown + */ + private String dropdownPositionToLanguage(int position) { + switch (position){ + case 0: + return "nl"; + case 1: + return "en"; + default: + return ""; + } + } + + /** + * converts language to the languageDropdown position + * @param language desired language to convert + * @return the position of the language in the languageDropdown + */ + private int languageToDropdownPosition(String language) { + switch (language) { + case "nl": + return 0; + case "en": + return 1; + default: + return 1; + } + } + + /** + * changes the current language to the desired language and saves this setting in SharedPreferences + * @param language the desired language to translate to + */ + private void setLocale(String language){ + Locale locale = new Locale(language); + Locale.setDefault(locale); + Configuration config = new Configuration(); + config.setLocale(locale); + getContext().getResources().getConfiguration().updateFrom(config); + editor.putString("Language", language); + editor.apply(); } } \ No newline at end of file From 062739ac7b15e97d38d89360c4f782becea68825 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 5 Jan 2021 16:02:48 +0100 Subject: [PATCH 07/12] added navigation to location from map --- .../com/a1/nextlocation/data/Location.java | 19 +++++ .../{CurrentRoute.java => StaticData.java} | 14 +++- .../nextlocation/fragments/HomeFragment.java | 70 +++++++++++++------ .../fragments/LocationDetailFragment.java | 16 +++++ 4 files changed, 95 insertions(+), 24 deletions(-) rename app/src/main/java/com/a1/nextlocation/data/{CurrentRoute.java => StaticData.java} (52%) diff --git a/app/src/main/java/com/a1/nextlocation/data/Location.java b/app/src/main/java/com/a1/nextlocation/data/Location.java index a0822fc..d8ecb58 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Location.java +++ b/app/src/main/java/com/a1/nextlocation/data/Location.java @@ -108,6 +108,25 @@ public class Location implements Parcelable { return long1 + "," + lat1; } + public double getDistance(Location other) { + double dlon = other.getLong() - getLong(); + double dlat = other.getLat() - getLong(); + double a = Math.pow(Math.sin(dlat / 2), 2) + + Math.cos(getLat()) * Math.cos(other.getLong()) + * Math.pow(Math.sin(dlon / 2),2); + + double c = 2 * Math.asin(Math.sqrt(a)); + + // Radius of earth in kilometers. Use 3956 + // for miles + double r = 6371; + + // calculate the result + double distance = c * r; + + return Math.floor(distance); + } + public GeoPoint convertToGeoPoint() { return new GeoPoint(this.getLat(),this.getLong()); } diff --git a/app/src/main/java/com/a1/nextlocation/data/CurrentRoute.java b/app/src/main/java/com/a1/nextlocation/data/StaticData.java similarity index 52% rename from app/src/main/java/com/a1/nextlocation/data/CurrentRoute.java rename to app/src/main/java/com/a1/nextlocation/data/StaticData.java index a0642f0..7114803 100644 --- a/app/src/main/java/com/a1/nextlocation/data/CurrentRoute.java +++ b/app/src/main/java/com/a1/nextlocation/data/StaticData.java @@ -2,8 +2,20 @@ package com.a1.nextlocation.data; import org.osmdroid.views.overlay.Polyline; -public enum CurrentRoute { +/** + * singleton to keep track of different global data + */ +public enum StaticData { INSTANCE; + private double distanceTraveled = 0; + + public void addDistance(double d) { + distanceTraveled += d; + } + + public double getDistanceTraveled() { + return distanceTraveled; + } private Polyline currentRoute; 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 4e0db7b..2aedc11 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -5,7 +5,6 @@ package com.a1.nextlocation.fragments; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; -import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.location.Location; import android.location.LocationListener; @@ -26,19 +25,12 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import com.a1.nextlocation.R; -import com.a1.nextlocation.data.CurrentRoute; -import com.a1.nextlocation.data.Route; +import com.a1.nextlocation.data.StaticData; import com.a1.nextlocation.json.DirectionsResult; import com.a1.nextlocation.network.ApiHandler; -import com.a1.nextlocation.recyclerview.CouponListManager; -import com.a1.nextlocation.recyclerview.CustomOverlay; import com.a1.nextlocation.recyclerview.LocationListManager; import org.osmdroid.api.IMapController; -import org.osmdroid.bonuspack.routing.MapQuestRoadManager; -import org.osmdroid.bonuspack.routing.OSRMRoadManager; -import org.osmdroid.bonuspack.routing.Road; -import org.osmdroid.bonuspack.routing.RoadManager; import org.osmdroid.config.Configuration; import org.osmdroid.util.GeoPoint; import org.osmdroid.views.MapView; @@ -52,11 +44,9 @@ import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider; import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; -public class HomeFragment extends Fragment { +public class HomeFragment extends Fragment implements LocationListener{ private final String userAgent = "com.ai.nextlocation.fragments"; public final static String MAPQUEST_API_KEY = "vuyXjqnAADpjeL9QwtgWGleIk95e36My"; private ImageButton imageButton; @@ -66,8 +56,7 @@ public class HomeFragment extends Fragment { // private RoadManager roadManager; private Polyline roadOverlay; private int color; - - private GeoPoint currentLocation; + private Location currentLocation; @Override public void onCreate(Bundle savedInstanceState) { @@ -114,7 +103,7 @@ public class HomeFragment extends Fragment { roadOverlay.setColor(color); - CurrentRoute.INSTANCE.setCurrentRoute(roadOverlay); + StaticData.INSTANCE.setCurrentRoute(roadOverlay); Log.d(TAG, "onDirectionsAvailable: successfully added road!"); } @@ -148,6 +137,8 @@ public class HomeFragment extends Fragment { compassOverlay.enableCompass(); mapView.getOverlays().add(compassOverlay); + addLocations(); + // add the location overlay MyLocationNewOverlay mLocationOverlay = new MyLocationNewOverlay(gpsMyLocationProvider, mapView); mLocationOverlay.enableFollowLocation(); @@ -165,9 +156,13 @@ public class HomeFragment extends Fragment { try { Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + if (currentLocation == null) { + currentLocation = location; + } + if( location != null ) { - currentLocation = new GeoPoint(location.getLatitude(), location.getLongitude()); - mapController.setCenter(currentLocation); + GeoPoint start = new GeoPoint(location.getLatitude(), location.getLongitude()); + mapController.setCenter(start); } } catch (SecurityException e) { @@ -183,15 +178,14 @@ public class HomeFragment extends Fragment { displayRoute(); - addLocations(); } private void displayRoute() { if (roadOverlay == null) { - if (CurrentRoute.INSTANCE.getCurrentRoute() != null) { - roadOverlay = CurrentRoute.INSTANCE.getCurrentRoute(); + if (StaticData.INSTANCE.getCurrentRoute() != null) { + roadOverlay = StaticData.INSTANCE.getCurrentRoute(); mapView.getOverlays().add(roadOverlay); mapView.invalidate(); Log.d(TAG, "initMap: successfully added road!"); @@ -206,7 +200,9 @@ public class HomeFragment extends Fragment { private void addLocations() { List locations = LocationListManager.INSTANCE.getLocationList(); final ArrayList items = new ArrayList<>(locations.size()); - Drawable marker = this.getResources().getDrawable(R.drawable.ic_baseline_location_on_24); + Drawable marker = ContextCompat.getDrawable(requireContext(),R.drawable.ic_baseline_location_on_24); + marker.setAlpha(255); + marker.setTint(getResources().getColor(R.color.primaryColour)); for (com.a1.nextlocation.data.Location location : locations) { OverlayItem item = new OverlayItem(location.getName(),location.getDescription(),location.convertToGeoPoint()); item.setMarker(marker); @@ -216,13 +212,19 @@ public class HomeFragment extends Fragment { new ItemizedIconOverlay.OnItemGestureListener() { @Override public boolean onItemSingleTapUp(int index, OverlayItem item) { - + com.a1.nextlocation.data.Location clicked = locations.get(index); + requireActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout, new LocationDetailFragment(clicked)).commit(); return false; } @Override public boolean onItemLongPress(int index, OverlayItem item) { - Toast.makeText(requireContext(), locations.get(index).getName(),Toast.LENGTH_SHORT).show(); + com.a1.nextlocation.data.Location clicked = locations.get(index); + Toast.makeText(requireContext(), clicked.getName(),Toast.LENGTH_SHORT).show(); +// Route route = new Route("Route to " + clicked.getName()); +// route.addLocation(new com.a1.nextlocation.data.Location("Current location",currentLocation.getLatitude(),currentLocation.getLongitude(),"your location",null)); +// route.addLocation(clicked); +// ApiHandler.INSTANCE.getDirections(route); return true; } },requireContext()); @@ -249,4 +251,26 @@ public class HomeFragment extends Fragment { REQUEST_PERMISSIONS_REQUEST_CODE); } } + + @Override + public void onLocationChanged(@NonNull Location location) { + double distance = currentLocation.distanceTo(location); // in meters + StaticData.INSTANCE.addDistance(distance); + currentLocation = location; + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + + } + + @Override + public void onProviderEnabled(@NonNull String provider) { + + } + + @Override + public void onProviderDisabled(@NonNull String provider) { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/a1/nextlocation/fragments/LocationDetailFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/LocationDetailFragment.java index 82bcabb..19f73cd 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/LocationDetailFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/LocationDetailFragment.java @@ -1,20 +1,33 @@ package com.a1.nextlocation.fragments; +import android.content.Intent; import android.os.Bundle; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import com.a1.nextlocation.R; +import com.a1.nextlocation.data.Location; public class LocationDetailFragment extends Fragment { + private static final String TAG = LocationDetailFragment.class.getCanonicalName(); private ImageButton imageButton; + private Location location; + + public LocationDetailFragment() { + + } + + public LocationDetailFragment(Location location) { + this.location = location; + } @Override public void onCreate(Bundle savedInstanceState) { @@ -31,6 +44,9 @@ public class LocationDetailFragment extends Fragment { ((FragmentActivity) view.getContext()).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout, locationFragment).addToBackStack(null).commit(); }); + if (location != null) { + Log.d(TAG, "onCreateView: the location has a name of: " + location.getName()); + } return view; } } \ No newline at end of file From f7a2a79d0011af7f391ce8285ac72005e6afbac6 Mon Sep 17 00:00:00 2001 From: Bart Date: Tue, 5 Jan 2021 16:20:43 +0100 Subject: [PATCH 08/12] Language can be changed, doesn't refresh automatically yet --- .../com/a1/nextlocation/MainActivity.java | 4 ++-- .../fragments/SettingsFragment.java | 11 +++++----- app/src/main/res/values-nl/strings.xml | 20 +++++++++++++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/values-nl/strings.xml diff --git a/app/src/main/java/com/a1/nextlocation/MainActivity.java b/app/src/main/java/com/a1/nextlocation/MainActivity.java index dc3b7cf..91268f0 100644 --- a/app/src/main/java/com/a1/nextlocation/MainActivity.java +++ b/app/src/main/java/com/a1/nextlocation/MainActivity.java @@ -70,7 +70,7 @@ public class MainActivity extends AppCompatActivity { */ private String loadLocale(){ SharedPreferences sharedPreferences = getSharedPreferences("Settings", Activity.MODE_PRIVATE); - return sharedPreferences.getString("Language", ""); + return sharedPreferences.getString("Language", "nl"); } /** @@ -82,7 +82,7 @@ public class MainActivity extends AppCompatActivity { Locale.setDefault(locale); Configuration configuration = new Configuration(); configuration.setLocale(locale); - getBaseContext().getResources().getConfiguration().updateFrom(configuration); + getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics()); } diff --git a/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java index 236ea8c..eaffcb0 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java @@ -55,7 +55,8 @@ public class SettingsFragment extends Fragment { languageDropdown.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - setLocale(dropdownPositionToLanguage(position)); + setLocale(dropdownPositionToLanguage(id)); + } @Override @@ -67,11 +68,11 @@ public class SettingsFragment extends Fragment { /** * converts the languageDropdown position to the belonging language - * @param position desired position to convert + * @param id desired position to convert * @return the language belonging to the position of the languageDropdown */ - private String dropdownPositionToLanguage(int position) { - switch (position){ + private String dropdownPositionToLanguage(long id) { + switch ((int) id){ case 0: return "nl"; case 1: @@ -106,7 +107,7 @@ public class SettingsFragment extends Fragment { Locale.setDefault(locale); Configuration config = new Configuration(); config.setLocale(locale); - getContext().getResources().getConfiguration().updateFrom(config); + getContext().getResources().updateConfiguration(config, getContext().getResources().getDisplayMetrics()); editor.putString("Language", language); editor.apply(); } diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml new file mode 100644 index 0000000..289db4c --- /dev/null +++ b/app/src/main/res/values-nl/strings.xml @@ -0,0 +1,20 @@ + + + + Next Location + Locaties + Routes + Statistieken + Instellingen + Taal + Imperiaal systeem + 65+ stand + Kleurenblind + Totale afstand: + Bezochte locaties: + Totale tijd: + Coupons gespaard: + Coupons + Start Route + + \ No newline at end of file From 587380fd893d8ffe543aee6f5a08d9386aba6bb4 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 5 Jan 2021 16:39:12 +0100 Subject: [PATCH 09/12] added updating location when you're close to it --- app/src/main/assets/locations.json | 2 +- .../com/a1/nextlocation/data/Location.java | 23 +++++++++++++++++++ .../com/a1/nextlocation/data/StaticData.java | 17 ++++++++++++++ .../nextlocation/fragments/HomeFragment.java | 15 ++++++++++++ .../fragments/StatisticFragment.java | 8 +++++++ .../main/res/layout/fragment_statistic.xml | 2 ++ 6 files changed, 66 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/locations.json b/app/src/main/assets/locations.json index 1bbddb1..c754cd3 100644 --- a/app/src/main/assets/locations.json +++ b/app/src/main/assets/locations.json @@ -82,7 +82,7 @@ "name":"MEZZ Breda Keizerstraat 101", "coordinates":"51.58394697737321,4.779757901349616", "description":"4811HL Breda", - "imageUrl":"NULL" + "imageUrl":"mezz_breda" }, { "name":"Het Klooster Breda Schorsmolenstraat 13", diff --git a/app/src/main/java/com/a1/nextlocation/data/Location.java b/app/src/main/java/com/a1/nextlocation/data/Location.java index d8ecb58..ed4ccc8 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Location.java +++ b/app/src/main/java/com/a1/nextlocation/data/Location.java @@ -35,6 +35,10 @@ public class Location implements Parcelable { this(name,getStringFromCoordinates(latCoord,longCoord),description,imageUrl); } + public Location(String name, android.location.Location loc, String description, String imageUrl) { + this(name,getStringFromCoordinates(loc.getLatitude(),loc.getLongitude()),description,imageUrl); + } + protected Location(Parcel in) { name = in.readString(); coordinates = in.readString(); @@ -127,6 +131,25 @@ public class Location implements Parcelable { return Math.floor(distance); } + public static double getDistance(double lat1, double lon1, double lat2, double lon2) { + double dlon = lon2 - lon1; + double dlat = lat2 - lat1; + double a = Math.pow(Math.sin(dlat / 2), 2) + + Math.cos(lat1) * Math.cos(lat2) + * Math.pow(Math.sin(dlon / 2),2); + + double c = 2 * Math.asin(Math.sqrt(a)); + + // Radius of earth in kilometers. Use 3956 + // for miles + double r = 6371; + + // calculate the result + double distance = c * r; + + return Math.floor(distance); + } + public GeoPoint convertToGeoPoint() { return new GeoPoint(this.getLat(),this.getLong()); } diff --git a/app/src/main/java/com/a1/nextlocation/data/StaticData.java b/app/src/main/java/com/a1/nextlocation/data/StaticData.java index 7114803..0f0d4e3 100644 --- a/app/src/main/java/com/a1/nextlocation/data/StaticData.java +++ b/app/src/main/java/com/a1/nextlocation/data/StaticData.java @@ -2,21 +2,38 @@ package com.a1.nextlocation.data; import org.osmdroid.views.overlay.Polyline; +import java.util.ArrayList; + /** * singleton to keep track of different global data */ public enum StaticData { INSTANCE; private double distanceTraveled = 0; + private int locationsVisited = 0; + + private ArrayList visitedNames = new ArrayList<>(); public void addDistance(double d) { distanceTraveled += d; } + public double getDistanceTraveled() { return distanceTraveled; } + public void visitLocation(Location location) { + if (!visitedNames.contains(location.getName())) { + locationsVisited++; + visitedNames.add(location.getName()); + } + } + + public int getLocationsVisited() { + return locationsVisited; + } + private Polyline currentRoute; public void setCurrentRoute(Polyline currentRoute) { 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 2aedc11..c20724b 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -154,7 +154,12 @@ public class HomeFragment extends Fragment implements LocationListener{ + try { + + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,this); + locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,this); + Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (currentLocation == null) { currentLocation = location; @@ -257,6 +262,16 @@ public class HomeFragment extends Fragment implements LocationListener{ double distance = currentLocation.distanceTo(location); // in meters StaticData.INSTANCE.addDistance(distance); currentLocation = location; + + Thread t = new Thread(() -> { + for (com.a1.nextlocation.data.Location l : LocationListManager.INSTANCE.getLocationList()) { + if (com.a1.nextlocation.data.Location.getDistance(currentLocation.getLatitude(),currentLocation.getLongitude(),l.getLat(),l.getLong()) < 10) { + StaticData.INSTANCE.visitLocation(l); + } + } + }); + + t.start(); } @Override diff --git a/app/src/main/java/com/a1/nextlocation/fragments/StatisticFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/StatisticFragment.java index a4080c5..83e3a07 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/StatisticFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/StatisticFragment.java @@ -16,6 +16,7 @@ import android.widget.Toast; import com.a1.nextlocation.R; import com.a1.nextlocation.data.Coupon; +import com.a1.nextlocation.data.StaticData; import com.a1.nextlocation.recyclerview.CouponAdapter; import com.a1.nextlocation.recyclerview.CouponListManager; @@ -36,6 +37,13 @@ public class StatisticFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_statistic, container, false); + TextView distance = view.findViewById(R.id.statistics_km); + TextView locs = view.findViewById(R.id.statistics_locations_visited); + double dist = StaticData.INSTANCE.getDistanceTraveled()/1000; + distance.setText("" + String.format("%.1f",dist) + " km"); + locs.setText("" + StaticData.INSTANCE.getLocationsVisited()); + + this.couponList = CouponListManager.INSTANCE.getCouponList(); CouponAdapter adapter = new CouponAdapter(this.getContext(), this.couponList); TextView couponNumber = view.findViewById(R.id.couponAmount); diff --git a/app/src/main/res/layout/fragment_statistic.xml b/app/src/main/res/layout/fragment_statistic.xml index 5abfdc0..ad0864e 100644 --- a/app/src/main/res/layout/fragment_statistic.xml +++ b/app/src/main/res/layout/fragment_statistic.xml @@ -55,6 +55,7 @@ /> Date: Tue, 5 Jan 2021 17:19:09 +0100 Subject: [PATCH 10/12] Finished language functionality --- .../fragments/SettingsFragment.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java index eaffcb0..9b5d16a 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java @@ -8,6 +8,7 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; @@ -52,16 +53,22 @@ public class SettingsFragment extends Fragment { // set the language dropdown on the currently selected language stored in the sharedPreferences languageDropdown.setSelection(languageToDropdownPosition(getContext().getSharedPreferences("Settings", Context.MODE_PRIVATE).getString("Language", ""))); + long previousID = languageDropdown.getSelectedItemId(); languageDropdown.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { setLocale(dropdownPositionToLanguage(id)); - + if (id != previousID){ + Fragment currentFragment = getActivity().getSupportFragmentManager().findFragmentById(R.id.fragment_layout); + FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); + fragmentTransaction.detach(currentFragment); + fragmentTransaction.attach(currentFragment); + fragmentTransaction.commit(); + } } @Override public void onNothingSelected(AdapterView parent) { - } }); } @@ -98,6 +105,17 @@ public class SettingsFragment extends Fragment { } } + /** + * reloads the fragment + */ + private void refresh(){ + Fragment currentFragment = getActivity().getSupportFragmentManager().findFragmentById(R.id.fragment_layout); + FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); + fragmentTransaction.detach(currentFragment); + fragmentTransaction.attach(currentFragment); + fragmentTransaction.commit(); + } + /** * changes the current language to the desired language and saves this setting in SharedPreferences * @param language the desired language to translate to From 80764591ad54dc1416d4dd1083c2170f2c5f2e4f Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Wed, 6 Jan 2021 10:36:37 +0100 Subject: [PATCH 11/12] comment --- .../main/java/com/a1/nextlocation/fragments/HomeFragment.java | 1 + 1 file changed, 1 insertion(+) 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 c20724b..1786782 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -263,6 +263,7 @@ public class HomeFragment extends Fragment implements LocationListener{ StaticData.INSTANCE.addDistance(distance); currentLocation = location; + //new thread because we don't want the main thread to hang Thread t = new Thread(() -> { for (com.a1.nextlocation.data.Location l : LocationListManager.INSTANCE.getLocationList()) { if (com.a1.nextlocation.data.Location.getDistance(currentLocation.getLatitude(),currentLocation.getLongitude(),l.getLat(),l.getLong()) < 10) { From 6dd2f5de40e246ccb160e15b9caf32626d8bc955 Mon Sep 17 00:00:00 2001 From: Bart Date: Wed, 6 Jan 2021 10:48:23 +0100 Subject: [PATCH 12/12] default strings.xml is now English, added more string resources --- .../fragments/CouponFragment.java | 12 +++------ .../fragments/SettingsFragment.java | 14 +++++----- app/src/main/res/values-en/strings.xml | 17 ------------ app/src/main/res/values-nl/strings.xml | 5 +++- app/src/main/res/values/strings.xml | 26 +++++++++++-------- 5 files changed, 31 insertions(+), 43 deletions(-) delete mode 100644 app/src/main/res/values-en/strings.xml diff --git a/app/src/main/java/com/a1/nextlocation/fragments/CouponFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/CouponFragment.java index 1faea7f..62c9432 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/CouponFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/CouponFragment.java @@ -62,22 +62,18 @@ public class CouponFragment extends Fragment { private void showPopup(Coupon coupon) { AlertDialog.Builder activateBuilder = new AlertDialog.Builder(getContext()); AlertDialog.Builder couponCodeBuilder = new AlertDialog.Builder(getContext()); - // TODO: use string resources instead of hardcoded strings - activateBuilder.setMessage("Weet je zeker dat je deze coupon wilt activeren?"); + activateBuilder.setMessage(getResources().getString(R.string.activate_question)); activateBuilder.setCancelable(true); - // TODO: use string resources instead of hardcoded strings - activateBuilder.setPositiveButton("activeren", (dialog, which) -> { - // TODO: use string resources instead of hardcoded strings + activateBuilder.setPositiveButton(R.string.activate, (dialog, which) -> { dialog.cancel(); couponCodeBuilder.setMessage("Code: " + coupon.getCode()); - couponCodeBuilder.setPositiveButton("Klaar", (dialog1, which1) -> { + couponCodeBuilder.setPositiveButton(R.string.done, (dialog1, which1) -> { dialog.cancel(); }); AlertDialog couponCodePopup = couponCodeBuilder.create(); couponCodePopup.show(); }); - // TODO: use string resources instead of hardcoded strings - activateBuilder.setNegativeButton("annuleren", (dialog, which) -> dialog.cancel()); + activateBuilder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.cancel()); AlertDialog couponPopup = activateBuilder.create(); couponPopup.show(); diff --git a/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java b/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java index 9b5d16a..9c0f42b 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/SettingsFragment.java @@ -25,8 +25,7 @@ import java.util.Locale; public class SettingsFragment extends Fragment { private SharedPreferences.Editor editor; - private String language; - + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -58,7 +57,7 @@ public class SettingsFragment extends Fragment { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { setLocale(dropdownPositionToLanguage(id)); - if (id != previousID){ + if (id != previousID) { Fragment currentFragment = getActivity().getSupportFragmentManager().findFragmentById(R.id.fragment_layout); FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.detach(currentFragment); @@ -75,11 +74,12 @@ public class SettingsFragment extends Fragment { /** * converts the languageDropdown position to the belonging language + * * @param id desired position to convert * @return the language belonging to the position of the languageDropdown */ private String dropdownPositionToLanguage(long id) { - switch ((int) id){ + switch ((int) id) { case 0: return "nl"; case 1: @@ -91,6 +91,7 @@ public class SettingsFragment extends Fragment { /** * converts language to the languageDropdown position + * * @param language desired language to convert * @return the position of the language in the languageDropdown */ @@ -108,7 +109,7 @@ public class SettingsFragment extends Fragment { /** * reloads the fragment */ - private void refresh(){ + private void refresh() { Fragment currentFragment = getActivity().getSupportFragmentManager().findFragmentById(R.id.fragment_layout); FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.detach(currentFragment); @@ -118,9 +119,10 @@ public class SettingsFragment extends Fragment { /** * changes the current language to the desired language and saves this setting in SharedPreferences + * * @param language the desired language to translate to */ - private void setLocale(String language){ + private void setLocale(String language) { Locale locale = new Locale(language); Locale.setDefault(locale); Configuration config = new Configuration(); diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml deleted file mode 100644 index 94b8326..0000000 --- a/app/src/main/res/values-en/strings.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - Location - Total time: - Total distance: - Language - Statistics - Start Route - Routes - Colorblind - Settings - Imperial system - Coupons collected: - Visited locations: - 65+ mode - Coupons - \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 289db4c..893ffe7 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,5 +16,8 @@ Coupons gespaard: Coupons Start Route - + Weet je zeker dat je deze coupon wilt activeren? + activeren + Klaar + annuleren \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9b25e32..1cfcd8d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,17 +1,21 @@ Next Location - Locaties + Location Routes - Statistieken - Instellingen - Taal - Imperiaal systeem - 65+ stand - Kleurenblind - Totale afstand: - Bezochte locaties: - Totale tijd: - Coupons gespaard: + Statistics + Settings + Language + Imperial system + 65+ mode + Colorblind + Total distance: + Visited locations: + Total time: + Coupons collected: Coupons Start Route + Are you sure you want to activate this coupon? + activate + Done + cancel \ No newline at end of file