merge with develop
This commit is contained in:
@@ -40,8 +40,10 @@ dependencies {
|
|||||||
implementation 'com.google.android.material:material:1.2.1'
|
implementation 'com.google.android.material:material:1.2.1'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
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'
|
implementation 'com.google.android.gms:play-services-maps:17.0.0'
|
||||||
testImplementation 'junit:junit:4.13.1'
|
testImplementation 'junit:junit:4.13.1'
|
||||||
|
// implementation "com.android.support:support-compat:28.0.0"
|
||||||
|
|
||||||
// okhttp
|
// okhttp
|
||||||
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
|
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
|
||||||
|
|||||||
@@ -25,6 +25,11 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
<receiver android:name=".geofencing.GeoFenceBroadcastReceiver">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.USER_PRESENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -20,6 +20,7 @@ public enum Data {
|
|||||||
private double zoom = 0;
|
private double zoom = 0;
|
||||||
private SharedPreferences.Editor editor;
|
private SharedPreferences.Editor editor;
|
||||||
private Context context;
|
private Context context;
|
||||||
|
private LocationProximityListener locationProximityListener;
|
||||||
|
|
||||||
public void setContext(Context context) {
|
public void setContext(Context context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
@@ -29,6 +30,15 @@ public enum Data {
|
|||||||
this.editor = editor;
|
this.editor = editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public LocationProximityListener getLocationProximityListener() {
|
||||||
|
return locationProximityListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocationProximityListener(LocationProximityListener locationProximityListener) {
|
||||||
|
this.locationProximityListener = locationProximityListener;
|
||||||
|
}
|
||||||
|
|
||||||
public double getZoom() {
|
public double getZoom() {
|
||||||
return zoom;
|
return zoom;
|
||||||
}
|
}
|
||||||
@@ -72,6 +82,11 @@ public enum Data {
|
|||||||
return locationsVisited;
|
return locationsVisited;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface LocationProximityListener {
|
||||||
|
void onLocationVisited(Location location);
|
||||||
|
}
|
||||||
|
|
||||||
public void saveVisitedNamesList(){
|
public void saveVisitedNamesList(){
|
||||||
Gson gson = new Gson();
|
Gson gson = new Gson();
|
||||||
String json = gson.toJson(visitedNames);
|
String json = gson.toJson(visitedNames);
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ public class Location implements Parcelable {
|
|||||||
private String imageUrl;
|
private String imageUrl;
|
||||||
private String iconUrl;
|
private String iconUrl;
|
||||||
|
|
||||||
|
private boolean visited;
|
||||||
|
|
||||||
public Location(@NotNull String name, String coordinates, String description, @Nullable String imageUrl) {
|
public Location(@NotNull String name, String coordinates, String description, @Nullable String imageUrl) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.coordinates = coordinates;
|
this.coordinates = coordinates;
|
||||||
@@ -171,4 +173,12 @@ public class Location implements Parcelable {
|
|||||||
parcel.writeString(description);
|
parcel.writeString(description);
|
||||||
parcel.writeString(imageUrl);
|
parcel.writeString(imageUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isVisited() {
|
||||||
|
return visited;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVisited(boolean visited) {
|
||||||
|
this.visited = visited;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,15 @@ public enum RouteHandler {
|
|||||||
private int stepCount = 0;
|
private int stepCount = 0;
|
||||||
private RouteFinishedListener routeFinishedListener;
|
private RouteFinishedListener routeFinishedListener;
|
||||||
private long startedTime;
|
private long startedTime;
|
||||||
|
private double currentRouteDuration;
|
||||||
|
|
||||||
|
public void setCurrentRouteDuration(double currentRouteDuration) {
|
||||||
|
this.currentRouteDuration = currentRouteDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getCurrentRouteDuration() {
|
||||||
|
return currentRouteDuration;
|
||||||
|
}
|
||||||
|
|
||||||
private Polyline currentRouteLine;
|
private Polyline currentRouteLine;
|
||||||
|
|
||||||
@@ -20,6 +29,7 @@ public enum RouteHandler {
|
|||||||
this.currentRouteLine = currentRouteLine;
|
this.currentRouteLine = currentRouteLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Polyline getCurrentRouteLine() {
|
public Polyline getCurrentRouteLine() {
|
||||||
return currentRouteLine;
|
return currentRouteLine;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package com.a1.nextlocation.fragments;
|
|||||||
|
|
||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@@ -20,6 +22,7 @@ import android.widget.Toast;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
@@ -27,6 +30,7 @@ import androidx.fragment.app.FragmentActivity;
|
|||||||
import com.a1.nextlocation.R;
|
import com.a1.nextlocation.R;
|
||||||
import com.a1.nextlocation.data.Data;
|
import com.a1.nextlocation.data.Data;
|
||||||
import com.a1.nextlocation.data.RouteHandler;
|
import com.a1.nextlocation.data.RouteHandler;
|
||||||
|
import com.a1.nextlocation.geofencing.GeofenceInitalizer;
|
||||||
import com.a1.nextlocation.json.DirectionsResult;
|
import com.a1.nextlocation.json.DirectionsResult;
|
||||||
import com.a1.nextlocation.network.ApiHandler;
|
import com.a1.nextlocation.network.ApiHandler;
|
||||||
import com.a1.nextlocation.recyclerview.LocationListManager;
|
import com.a1.nextlocation.recyclerview.LocationListManager;
|
||||||
@@ -61,6 +65,8 @@ public class HomeFragment extends Fragment implements LocationListener {
|
|||||||
private int color;
|
private int color;
|
||||||
private Location currentLocation;
|
private Location currentLocation;
|
||||||
private Overlay allLocationsOverlay;
|
private Overlay allLocationsOverlay;
|
||||||
|
private GeofenceInitalizer initializer;
|
||||||
|
private final static String CHANNEL_ID = "next_location01";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
@@ -72,6 +78,7 @@ public class HomeFragment extends Fragment implements LocationListener {
|
|||||||
Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||||
|
|
||||||
color = requireContext().getColor(R.color.red);
|
color = requireContext().getColor(R.color.red);
|
||||||
|
Data.INSTANCE.setLocationProximityListener(this::onLocationVisited);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -133,6 +140,7 @@ public class HomeFragment extends Fragment implements LocationListener {
|
|||||||
roadOverlay.setColor(color);
|
roadOverlay.setColor(color);
|
||||||
|
|
||||||
// pass the line to the route handler
|
// pass the line to the route handler
|
||||||
|
RouteHandler.INSTANCE.setCurrentRouteDuration(directionsResult.getDuration());
|
||||||
RouteHandler.INSTANCE.setCurrentRouteLine(roadOverlay);
|
RouteHandler.INSTANCE.setCurrentRouteLine(roadOverlay);
|
||||||
Log.d(TAG, "onDirectionsAvailable: successfully added road!");
|
Log.d(TAG, "onDirectionsAvailable: successfully added road!");
|
||||||
|
|
||||||
@@ -142,6 +150,7 @@ public class HomeFragment extends Fragment implements LocationListener {
|
|||||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
initializer = new GeofenceInitalizer(requireContext(),requireActivity());
|
||||||
initMap(view);
|
initMap(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,6 +227,8 @@ public class HomeFragment extends Fragment implements LocationListener {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* displays the route that is currently being followed as a red line
|
* displays the route that is currently being followed as a red line
|
||||||
*/
|
*/
|
||||||
@@ -246,6 +257,7 @@ public class HomeFragment extends Fragment implements LocationListener {
|
|||||||
private void addLocations() {
|
private void addLocations() {
|
||||||
// get the locations of the current route or all locations
|
// get the locations of the current route or all locations
|
||||||
List<com.a1.nextlocation.data.Location> locations = RouteHandler.INSTANCE.isFollowingRoute() ? RouteHandler.INSTANCE.getCurrentRoute().getLocations() : LocationListManager.INSTANCE.getLocationList();
|
List<com.a1.nextlocation.data.Location> locations = RouteHandler.INSTANCE.isFollowingRoute() ? RouteHandler.INSTANCE.getCurrentRoute().getLocations() : LocationListManager.INSTANCE.getLocationList();
|
||||||
|
initializer.removeGeoFences();
|
||||||
final ArrayList<OverlayItem> items = new ArrayList<>(locations.size());
|
final ArrayList<OverlayItem> items = new ArrayList<>(locations.size());
|
||||||
// marker icon
|
// marker icon
|
||||||
Drawable marker = ContextCompat.getDrawable(requireContext(), R.drawable.ic_baseline_location_on_24);
|
Drawable marker = ContextCompat.getDrawable(requireContext(), R.drawable.ic_baseline_location_on_24);
|
||||||
@@ -300,6 +312,19 @@ public class HomeFragment extends Fragment implements LocationListener {
|
|||||||
mapView.getOverlays().add(allLocationsOverlay);
|
mapView.getOverlays().add(allLocationsOverlay);
|
||||||
Log.d(TAG, "addLocations: successfully added locations");
|
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<com.a1.nextlocation.data.Location> locations) {
|
||||||
|
|
||||||
|
Log.d(TAG, "addGeofences: adding geofences!");
|
||||||
|
|
||||||
|
initializer.init(locations);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -367,6 +392,33 @@ 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
|
// empty override methods for the LocationListener
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
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.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.GeofenceStatusCodes;
|
||||||
|
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();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
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
|
||||||
|
.getStatusCodeString(geofencingEvent.getErrorCode());
|
||||||
|
Log.e(TAG, errorMessage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the transition type.
|
||||||
|
int geofenceTransition = geofencingEvent.getGeofenceTransition();
|
||||||
|
|
||||||
|
switch (geofenceTransition) {
|
||||||
|
case Geofence.GEOFENCE_TRANSITION_ENTER:
|
||||||
|
List<Geofence> 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
|
||||||
|
Data.INSTANCE.getLocationProximityListener().onLocationVisited(l);
|
||||||
|
Log.d(TAG, "onReceive: VISITED LOCATION " + l.getName());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case Geofence.GEOFENCE_TRANSITION_EXIT:
|
||||||
|
Log.d(TAG, "onReceive: exiting geofence...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
|
|
||||||
|
return pendingIntent;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
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;
|
||||||
|
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 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<Location> locations;
|
||||||
|
private int BACKGROUND_LOCATION_ACCESS_REQUEST_CODE = 10002;
|
||||||
|
|
||||||
|
public GeofenceInitalizer(Context context, Activity activity) {
|
||||||
|
this.context = context;
|
||||||
|
this.activity = activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(List<Location> locations) {
|
||||||
|
if (!checkFineLocationPermission()) return;
|
||||||
|
|
||||||
|
geofencingClient = LocationServices.getGeofencingClient(context);
|
||||||
|
geoFencingHelper = new GeoFencingHelper(context);
|
||||||
|
this.locations = locations;
|
||||||
|
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() {
|
||||||
|
for (Location location : locations) {
|
||||||
|
GeoPoint t = new GeoPoint(location.getLat(), location.getLong());
|
||||||
|
addGeofence(t, location.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
if (!checkFineLocationPermission()) return;
|
||||||
|
|
||||||
|
Geofence geofence = geoFencingHelper.getGeofence(name, p, 45);
|
||||||
|
GeofencingRequest geofencingRequest = geoFencingHelper.getGeoFencingRequest(geofence);
|
||||||
|
PendingIntent pendingIntent = geoFencingHelper.getPendingIntent();
|
||||||
|
|
||||||
|
geofencingClient.addGeofences(geofencingRequest, pendingIntent).addOnSuccessListener(v -> {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,4 +26,6 @@
|
|||||||
<string name="Chinese">Chinees</string>
|
<string name="Chinese">Chinees</string>
|
||||||
<string name="help">HELP</string>
|
<string name="help">HELP</string>
|
||||||
<string name="help_discription">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</string>
|
<string name="help_discription">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</string>
|
||||||
|
<string name="notification_title">Je bent dicht bij een locatie!</string>
|
||||||
|
<string name="notification_text">Je bent bijna bij %1$s</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -25,4 +25,6 @@
|
|||||||
<string name="Chinese">Chinese</string>
|
<string name="Chinese">Chinese</string>
|
||||||
<string name="help">HELP</string>
|
<string name="help">HELP</string>
|
||||||
<string name="help_discription">Hasn\'t been translated yet</string>
|
<string name="help_discription">Hasn\'t been translated yet</string>
|
||||||
|
<string name="notification_title">You\'re close to a location!</string>
|
||||||
|
<string name="notification_text">You\'re almost at %1$s</string>
|
||||||
</resources>
|
</resources>
|
||||||
Reference in New Issue
Block a user