From e286929b77ad317f17e82f17b3435b054b88fddf Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 12 Jan 2021 11:12:28 +0100 Subject: [PATCH 1/3] added geofencing stuff --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 1 + .../java/com/a1/nextlocation/data/Data.java | 14 +++++ .../com/a1/nextlocation/data/Location.java | 10 +++ .../nextlocation/fragments/HomeFragment.java | 20 ++++++ .../geofencing/GeoFenceBroadcastReceiver.java | 55 ++++++++++++++++ .../geofencing/GeoFencingHelper.java | 51 +++++++++++++++ .../geofencing/GeofenceInitalizer.java | 62 +++++++++++++++++++ 8 files changed, 214 insertions(+) create mode 100644 app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java create mode 100644 app/src/main/java/com/a1/nextlocation/geofencing/GeoFencingHelper.java create mode 100644 app/src/main/java/com/a1/nextlocation/geofencing/GeofenceInitalizer.java diff --git a/app/build.gradle b/app/build.gradle index 8bcfb89..34bae3b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -40,6 +40,7 @@ dependencies { implementation 'com.google.android.material:material:1.2.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'com.google.android.gms:play-services-location:17.1.0' implementation 'com.google.android.gms:play-services-maps:17.0.0' testImplementation 'junit:junit:4.13.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d0c446..fb7b89b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,6 +25,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/a1/nextlocation/data/Data.java b/app/src/main/java/com/a1/nextlocation/data/Data.java index 73e37b7..182090e 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Data.java +++ b/app/src/main/java/com/a1/nextlocation/data/Data.java @@ -11,6 +11,15 @@ public enum Data { private int locationsVisited = 0; private long totalTime = 0; private double zoom = 0; + private LocationProximityListener locationProximityListener; + + public LocationProximityListener getLocationProximityListener() { + return locationProximityListener; + } + + public void setLocationProximityListener(LocationProximityListener locationProximityListener) { + this.locationProximityListener = locationProximityListener; + } public double getZoom() { return zoom; @@ -50,5 +59,10 @@ public enum Data { return locationsVisited; } + @FunctionalInterface + public interface LocationProximityListener { + void onLocationVisited(Location location); + } + } 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 86785cc..ae99308 100644 --- a/app/src/main/java/com/a1/nextlocation/data/Location.java +++ b/app/src/main/java/com/a1/nextlocation/data/Location.java @@ -25,6 +25,8 @@ public class Location implements Parcelable { private String imageUrl; private String iconUrl; + private boolean visited; + public Location(@NotNull String name, String coordinates, String description, @Nullable String imageUrl) { this.name = name; this.coordinates = coordinates; @@ -171,4 +173,12 @@ public class Location implements Parcelable { parcel.writeString(description); parcel.writeString(imageUrl); } + + public boolean isVisited() { + return visited; + } + + public void setVisited(boolean visited) { + this.visited = visited; + } } 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 cf442a1..27970a4 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -26,6 +26,7 @@ import androidx.fragment.app.FragmentActivity; import com.a1.nextlocation.R; import com.a1.nextlocation.data.Data; import com.a1.nextlocation.data.RouteHandler; +import com.a1.nextlocation.geofencing.GeofenceInitalizer; import com.a1.nextlocation.json.DirectionsResult; import com.a1.nextlocation.network.ApiHandler; import com.a1.nextlocation.recyclerview.LocationListManager; @@ -71,6 +72,7 @@ public class HomeFragment extends Fragment implements LocationListener { Manifest.permission.WRITE_EXTERNAL_STORAGE); color = requireContext().getColor(R.color.red); + Data.INSTANCE.setLocationProximityListener(this::onLocationVisited); } @Override @@ -217,6 +219,8 @@ public class HomeFragment extends Fragment implements LocationListener { } + + /** * displays the route that is currently being followed as a red line */ @@ -299,6 +303,17 @@ public class HomeFragment extends Fragment implements LocationListener { mapView.getOverlays().add(allLocationsOverlay); Log.d(TAG, "addLocations: successfully added locations"); + addGeofences(locations); + + } + + /** + * adds the geofences for the currently active locations + * @param locations the locations to add geofences for + */ + private void addGeofences(List locations) { + GeofenceInitalizer initializer = new GeofenceInitalizer(requireContext()); + initializer.init(locations); } /** @@ -365,6 +380,11 @@ public class HomeFragment extends Fragment implements LocationListener { } + public void onLocationVisited(com.a1.nextlocation.data.Location location) { + Data.INSTANCE.visitLocation(location); + + } + // empty override methods for the LocationListener @Override diff --git a/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java new file mode 100644 index 0000000..37c49a4 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java @@ -0,0 +1,55 @@ +package com.a1.nextlocation.geofencing; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import com.a1.nextlocation.data.Location; +import com.a1.nextlocation.recyclerview.LocationListManager; +import com.google.android.gms.location.Geofence; +import com.google.android.gms.location.GeofenceStatusCodes; +import com.google.android.gms.location.GeofencingEvent; + +import java.util.List; + +public class GeoFenceBroadcastReceiver extends BroadcastReceiver { + private final String TAG = GeoFenceBroadcastReceiver.class.getCanonicalName(); + + @Override + public void onReceive(Context context, Intent intent) { + + GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); + + if (geofencingEvent.hasError()) { + String errorMessage = GeofenceStatusCodes + .getStatusCodeString(geofencingEvent.getErrorCode()); + Log.e(TAG, errorMessage); + return; + } + + // Get the transition type. + int geofenceTransition = geofencingEvent.getGeofenceTransition(); + + switch (geofenceTransition) { + case Geofence.GEOFENCE_TRANSITION_ENTER: + List geofenceList = geofencingEvent.getTriggeringGeofences(); + // loop through list of geofences + for (Geofence geofence : geofenceList) { + for (Location l : LocationListManager.INSTANCE.getLocationList()) { + if (geofence.getRequestId().equals(l.getName())) { + l.setVisited(true); + // let the homefragment know that we are close to a location + + break; + } + } + } + + break; + case Geofence.GEOFENCE_TRANSITION_EXIT: + Log.d(TAG, "onReceive: exiting geofence..."); + break; + } + } +} diff --git a/app/src/main/java/com/a1/nextlocation/geofencing/GeoFencingHelper.java b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFencingHelper.java new file mode 100644 index 0000000..dd9e8d4 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFencingHelper.java @@ -0,0 +1,51 @@ +package com.a1.nextlocation.geofencing; + +import android.app.PendingIntent; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.provider.SyncStateContract; + +import com.google.android.gms.location.Geofence; +import com.google.android.gms.location.GeofencingRequest; + +import org.osmdroid.util.GeoPoint; + +public class GeoFencingHelper extends ContextWrapper { + private PendingIntent pendingIntent; + + public GeoFencingHelper(Context base) { + super(base); + } + + public GeofencingRequest getGeoFencingRequest(Geofence geofence) { + GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); + builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); + builder.addGeofence(geofence); + return builder.build(); + + } + + public Geofence getGeofence(String ID, GeoPoint point, float radius) { + + return new Geofence.Builder() + .setCircularRegion(point.getLatitude(), point.getLongitude(), radius) + .setRequestId(ID) + .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | + Geofence.GEOFENCE_TRANSITION_EXIT) + .setLoiteringDelay(5000) + .setExpirationDuration(Geofence.NEVER_EXPIRE) + .build(); + } + + public PendingIntent getPendingIntent() { + if (pendingIntent != null) { + return pendingIntent; + } + + Intent intent = new Intent(this, GeoFenceBroadcastReceiver.class); + pendingIntent = PendingIntent.getBroadcast(this, 2607, intent, PendingIntent.FLAG_UPDATE_CURRENT); + + return pendingIntent; + } +} diff --git a/app/src/main/java/com/a1/nextlocation/geofencing/GeofenceInitalizer.java b/app/src/main/java/com/a1/nextlocation/geofencing/GeofenceInitalizer.java new file mode 100644 index 0000000..874c6b8 --- /dev/null +++ b/app/src/main/java/com/a1/nextlocation/geofencing/GeofenceInitalizer.java @@ -0,0 +1,62 @@ +package com.a1.nextlocation.geofencing; + +import android.Manifest; +import android.app.PendingIntent; +import android.content.Context; +import android.content.pm.PackageManager; +import android.util.Log; + +import androidx.core.app.ActivityCompat; + +import com.a1.nextlocation.data.Data; +import com.a1.nextlocation.data.Location; +import com.a1.nextlocation.recyclerview.LocationListManager; +import com.google.android.gms.location.Geofence; +import com.google.android.gms.location.GeofencingClient; +import com.google.android.gms.location.GeofencingRequest; +import com.google.android.gms.location.LocationServices; + +import org.osmdroid.util.GeoPoint; + +import java.util.List; + +public class GeofenceInitalizer { + private GeofencingClient geofencingClient; + private GeoFencingHelper geoFencingHelper; + private final Context context; + private final String TAG = GeofenceInitalizer.class.getCanonicalName(); + private List locations; + + public GeofenceInitalizer(Context context) { + this.context = context; + } + + public void init(List locations) { + geofencingClient = LocationServices.getGeofencingClient(context); + geoFencingHelper = new GeoFencingHelper(context); + this.locations = locations; + addFences(); + } + + private void addFences() { + for (Location location : locations) { + GeoPoint t = new GeoPoint(location.getLat(), location.getLong()); + addGeofence(t, location.getName()); + } + } + + private void addGeofence(GeoPoint p, String name) { + Geofence geofence = geoFencingHelper.getGeofence(name, p, 30); + GeofencingRequest geofencingRequest = geoFencingHelper.getGeoFencingRequest(geofence); + PendingIntent pendingIntent = geoFencingHelper.getPendingIntent(); + + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + return; + } + geofencingClient.addGeofences(geofencingRequest, pendingIntent).addOnSuccessListener(v -> { + Log.d(TAG, "addGeofence: added geofence"); + }).addOnFailureListener(v -> { + + }); + } +} From 5544da5d2e211fbf205ecb0c1039198fc0ce6374 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 12 Jan 2021 13:22:00 +0100 Subject: [PATCH 2/3] add geofencing --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 6 +- .../nextlocation/fragments/HomeFragment.java | 33 +++++++++- .../geofencing/GeoFenceBroadcastReceiver.java | 5 +- .../geofencing/GeoFencingHelper.java | 2 +- .../geofencing/GeofenceInitalizer.java | 63 ++++++++++++++++--- app/src/main/res/values-nl/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 8 files changed, 102 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 34bae3b..d97dbd5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,6 +43,7 @@ dependencies { implementation 'com.google.android.gms:play-services-location:17.1.0' implementation 'com.google.android.gms:play-services-maps:17.0.0' testImplementation 'junit:junit:4.13.1' +// implementation "com.android.support:support-compat:28.0.0" // okhttp implementation 'com.squareup.okhttp3:okhttp:4.9.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fb7b89b..b2cdc54 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,7 +25,11 @@ - + + + + + \ No newline at end of file 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 27970a4..db67ec8 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -2,6 +2,8 @@ package com.a1.nextlocation.fragments; import android.Manifest; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; @@ -19,6 +21,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; @@ -61,6 +64,8 @@ public class HomeFragment extends Fragment implements LocationListener { private int color; private Location currentLocation; private Overlay allLocationsOverlay; + private GeofenceInitalizer initializer; + private final static String CHANNEL_ID = "next_location01"; @Override public void onCreate(Bundle savedInstanceState) { @@ -143,6 +148,7 @@ public class HomeFragment extends Fragment implements LocationListener { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + initializer = new GeofenceInitalizer(requireContext(),requireActivity()); initMap(view); } @@ -249,6 +255,7 @@ public class HomeFragment extends Fragment implements LocationListener { private void addLocations() { // get the locations of the current route or all locations List locations = RouteHandler.INSTANCE.isFollowingRoute() ? RouteHandler.INSTANCE.getCurrentRoute().getLocations() : LocationListManager.INSTANCE.getLocationList(); + initializer.removeGeoFences(); final ArrayList items = new ArrayList<>(locations.size()); // marker icon Drawable marker = ContextCompat.getDrawable(requireContext(), R.drawable.ic_baseline_location_on_24); @@ -312,7 +319,9 @@ public class HomeFragment extends Fragment implements LocationListener { * @param locations the locations to add geofences for */ private void addGeofences(List locations) { - GeofenceInitalizer initializer = new GeofenceInitalizer(requireContext()); + + Log.d(TAG, "addGeofences: adding geofences!"); + initializer.init(locations); } @@ -382,9 +391,31 @@ public class HomeFragment extends Fragment implements LocationListener { public void onLocationVisited(com.a1.nextlocation.data.Location location) { Data.INSTANCE.visitLocation(location); + showNotification(location); } + private void showNotification(com.a1.nextlocation.data.Location location) { + + NotificationManager mNotificationManager = (NotificationManager) requireActivity().getSystemService(Context.NOTIFICATION_SERVICE); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + int importance = NotificationManager.IMPORTANCE_LOW; + NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID, "next_location", importance); + notificationChannel.enableLights(true); + notificationChannel.enableVibration(true); + notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400}); + mNotificationManager.createNotificationChannel(notificationChannel); + } + + NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(requireContext(),CHANNEL_ID) + .setSmallIcon(R.drawable.ic_launcher_foreground) + .setContentTitle(getString(R.string.notification_title)) + .setContentText(getString(R.string.notification_text,location.getName())) + .setAutoCancel(true); + + mNotificationManager.notify(0,mBuilder.build()); + } + // empty override methods for the LocationListener @Override diff --git a/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java index 37c49a4..382cad8 100644 --- a/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java +++ b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.util.Log; +import com.a1.nextlocation.data.Data; import com.a1.nextlocation.data.Location; import com.a1.nextlocation.recyclerview.LocationListManager; import com.google.android.gms.location.Geofence; @@ -20,6 +21,7 @@ public class GeoFenceBroadcastReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); + Log.i(TAG, "onReceive: RECEIVED GEOFENCE STUFF"); if (geofencingEvent.hasError()) { String errorMessage = GeofenceStatusCodes @@ -40,7 +42,8 @@ public class GeoFenceBroadcastReceiver extends BroadcastReceiver { if (geofence.getRequestId().equals(l.getName())) { l.setVisited(true); // let the homefragment know that we are close to a location - + Data.INSTANCE.getLocationProximityListener().onLocationVisited(l); + Log.d(TAG, "onReceive: VISITED LOCATION " + l.getName()); break; } } diff --git a/app/src/main/java/com/a1/nextlocation/geofencing/GeoFencingHelper.java b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFencingHelper.java index dd9e8d4..01f6335 100644 --- a/app/src/main/java/com/a1/nextlocation/geofencing/GeoFencingHelper.java +++ b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFencingHelper.java @@ -44,7 +44,7 @@ public class GeoFencingHelper extends ContextWrapper { } Intent intent = new Intent(this, GeoFenceBroadcastReceiver.class); - pendingIntent = PendingIntent.getBroadcast(this, 2607, intent, PendingIntent.FLAG_UPDATE_CURRENT); + pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); return pendingIntent; } diff --git a/app/src/main/java/com/a1/nextlocation/geofencing/GeofenceInitalizer.java b/app/src/main/java/com/a1/nextlocation/geofencing/GeofenceInitalizer.java index 874c6b8..7a1af31 100644 --- a/app/src/main/java/com/a1/nextlocation/geofencing/GeofenceInitalizer.java +++ b/app/src/main/java/com/a1/nextlocation/geofencing/GeofenceInitalizer.java @@ -1,12 +1,16 @@ package com.a1.nextlocation.geofencing; import android.Manifest; +import android.app.Activity; import android.app.PendingIntent; import android.content.Context; import android.content.pm.PackageManager; +import android.os.Build; import android.util.Log; +import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; import com.a1.nextlocation.data.Data; import com.a1.nextlocation.data.Location; @@ -15,27 +19,53 @@ import com.google.android.gms.location.Geofence; import com.google.android.gms.location.GeofencingClient; import com.google.android.gms.location.GeofencingRequest; import com.google.android.gms.location.LocationServices; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; import org.osmdroid.util.GeoPoint; import java.util.List; +import static android.content.ContentValues.TAG; + public class GeofenceInitalizer { + private final Activity activity; private GeofencingClient geofencingClient; private GeoFencingHelper geoFencingHelper; private final Context context; private final String TAG = GeofenceInitalizer.class.getCanonicalName(); private List locations; + private int BACKGROUND_LOCATION_ACCESS_REQUEST_CODE = 10002; - public GeofenceInitalizer(Context context) { + public GeofenceInitalizer(Context context, Activity activity) { this.context = context; + this.activity = activity; } public void init(List locations) { + if (!checkFineLocationPermission()) return; + geofencingClient = LocationServices.getGeofencingClient(context); geoFencingHelper = new GeoFencingHelper(context); this.locations = locations; - addFences(); + if (Build.VERSION.SDK_INT >= 29) { + //If API is higher then 29 we need background permission + + if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED) { + addFences(); + } else { + //Permission is not granted!! Need to request it.. + if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_BACKGROUND_LOCATION)) { + //We show a dialog and ask for permission + ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, BACKGROUND_LOCATION_ACCESS_REQUEST_CODE); + } else { + ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, BACKGROUND_LOCATION_ACCESS_REQUEST_CODE); + + } + } + } else { + addFences(); + } } private void addFences() { @@ -45,18 +75,35 @@ public class GeofenceInitalizer { } } + public void removeGeoFences() { + geofencingClient = LocationServices.getGeofencingClient(context); + geoFencingHelper = new GeoFencingHelper(context); + + PendingIntent pendingIntent = geoFencingHelper.getPendingIntent(); + + geofencingClient.removeGeofences(pendingIntent) + .addOnSuccessListener(aVoid -> Log.d(TAG, "Geofence is removed... ")) + .addOnFailureListener(e -> Log.d(TAG, e.getLocalizedMessage())); + if (this.locations != null) this.locations.clear(); + + } + private void addGeofence(GeoPoint p, String name) { - Geofence geofence = geoFencingHelper.getGeofence(name, p, 30); + if (!checkFineLocationPermission()) return; + + Geofence geofence = geoFencingHelper.getGeofence(name, p, 45); GeofencingRequest geofencingRequest = geoFencingHelper.getGeoFencingRequest(geofence); PendingIntent pendingIntent = geoFencingHelper.getPendingIntent(); - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - return; - } geofencingClient.addGeofences(geofencingRequest, pendingIntent).addOnSuccessListener(v -> { - Log.d(TAG, "addGeofence: added geofence"); + Log.i(TAG, "addGeofence: added geofence"); }).addOnFailureListener(v -> { - + Log.e(TAG, "addGeofence: failure adding geofence " + v.getMessage()); }); + Log.i(TAG, "addGeofence: added geofence to client"); + } + + private boolean checkFineLocationPermission() { + return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; } } diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index b18831e..367dd5e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -26,4 +26,6 @@ Chinees HELP Onderaan het scherm zijn verschillende knoppen te zien. Deze knoppen hebben de volgende functies: \n\nLocaties: toont een lijst met alle locaties die bezocht kunnen worden. Elke locatie wordt kort beschreven. \n\nRoutes: Toont een lijst met alle routes die gelopen kunnen worden. Van elke route wordt een omschrijving gegeven. \n\nStatistieken: Toont persoonlijke statistieken. \n\nInstellingen: Hier kunnen app-instellingen worden aangepast naar eigen voorkeur. \n\nEen locatie ingedrukt houden laat extra informatie zien over de gekozen locatie + Je bent dicht bij een locatie! + Je bent bijna bij %1$s \ 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 c965083..0c084f1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,4 +25,6 @@ Chinese HELP Hasn\'t been translated yet + You\'re close to a location! + You\'re almost at %1$s \ No newline at end of file From 39ff2684cbb006bbd63224044a9992d6ea004bf7 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 12 Jan 2021 13:51:50 +0100 Subject: [PATCH 3/3] added saving route duration --- .../java/com/a1/nextlocation/data/RouteHandler.java | 10 ++++++++++ .../com/a1/nextlocation/fragments/HomeFragment.java | 1 + .../geofencing/GeoFenceBroadcastReceiver.java | 3 +++ 3 files changed, 14 insertions(+) diff --git a/app/src/main/java/com/a1/nextlocation/data/RouteHandler.java b/app/src/main/java/com/a1/nextlocation/data/RouteHandler.java index a6959e7..331d28e 100644 --- a/app/src/main/java/com/a1/nextlocation/data/RouteHandler.java +++ b/app/src/main/java/com/a1/nextlocation/data/RouteHandler.java @@ -13,6 +13,15 @@ public enum RouteHandler { private int stepCount = 0; private RouteFinishedListener routeFinishedListener; private long startedTime; + private double currentRouteDuration; + + public void setCurrentRouteDuration(double currentRouteDuration) { + this.currentRouteDuration = currentRouteDuration; + } + + public double getCurrentRouteDuration() { + return currentRouteDuration; + } private Polyline currentRouteLine; @@ -20,6 +29,7 @@ public enum RouteHandler { this.currentRouteLine = currentRouteLine; } + public Polyline getCurrentRouteLine() { return currentRouteLine; } 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 db67ec8..2330912 100644 --- a/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java +++ b/app/src/main/java/com/a1/nextlocation/fragments/HomeFragment.java @@ -139,6 +139,7 @@ public class HomeFragment extends Fragment implements LocationListener { roadOverlay.setColor(color); // pass the line to the route handler + RouteHandler.INSTANCE.setCurrentRouteDuration(directionsResult.getDuration()); RouteHandler.INSTANCE.setCurrentRouteLine(roadOverlay); Log.d(TAG, "onDirectionsAvailable: successfully added road!"); diff --git a/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java index 382cad8..eff3ec2 100644 --- a/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java +++ b/app/src/main/java/com/a1/nextlocation/geofencing/GeoFenceBroadcastReceiver.java @@ -14,6 +14,9 @@ import com.google.android.gms.location.GeofencingEvent; import java.util.List; +/** + * broadcast receiver for geofence events + */ public class GeoFenceBroadcastReceiver extends BroadcastReceiver { private final String TAG = GeoFenceBroadcastReceiver.class.getCanonicalName();