From 5e51be5d0b75214e1e097a76790d3543aa85e8c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mieszko=20Wrzeszczy=C5=84ski?= Date: Wed, 5 Dec 2018 00:45:16 +0100 Subject: [PATCH 1/3] First attempt --- .../findmytutor/activity/BaseActivity.java | 9 +-- .../BackgroundLocalizationService.java | 77 ++++++++++++++----- .../utils/ManualLocationUtils.java | 2 - 3 files changed, 62 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java index 3209b11..da73814 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java @@ -77,6 +77,7 @@ public abstract class BaseActivity private Fragment userListFragment; private ActiveFragment activeFragment = ActiveFragment.NONE; + private Fragment activeBottomMenu = null; private SearchView searchView; @SuppressLint("CheckResult") @@ -351,7 +352,7 @@ public abstract class BaseActivity } else if (itemId == R.id.nav_user_list) { loadUserListFragment(); } - + selectBottomNavigationBarItem(itemId); }, 300); return true; @@ -363,6 +364,7 @@ public abstract class BaseActivity FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.activity_content, sharingFragment); ft.commit(); + } private void loadUserListFragment() { @@ -372,8 +374,8 @@ public abstract class BaseActivity FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.activity_content, userListFragment); ft.commit(); - } + } private void updateNavigationBarState() { int actionId = getNavigationMenuItemId(); @@ -385,9 +387,6 @@ public abstract class BaseActivity item.setChecked(true); } - - abstract int getNavigationMenuItemId(); - abstract int getContentViewId(); } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java b/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java index 47e0730..20df4d6 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java @@ -23,6 +23,7 @@ import android.support.v4.app.ActivityCompat; import android.support.v4.app.NotificationCompat; import android.util.Log; +import com.annimon.stream.Stream; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationServices; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; @@ -36,16 +37,21 @@ import com.uam.wmi.findmytutor.utils.RestApiHelper; import com.uam.wmi.findmytutor.utils.SharingLevel; import com.uam.wmi.findmytutor.utils.MapUtils; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.queue.CircularFifoQueue; + import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.Queue; import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicReference; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.observers.DisposableSingleObserver; import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; -import timber.log.Timber; import static com.uam.wmi.findmytutor.utils.Consts.presenceApproximatedName; import static com.uam.wmi.findmytutor.utils.Consts.presenceLatitude; @@ -59,6 +65,10 @@ public class BackgroundLocalizationService extends Service { private static final float LOCATION_DISTANCE = 5f; public static String str_receiver = "background.location.broadcast"; private static long notify_interval = 10000; + private static long notify_interval_inside_building = 10000; + private static long notify_interval_outside_building = 20000; + //private static long notify_interval_outside_building = 900000; + private CircularFifoQueue coordinatesHistory = new CircularFifoQueue(5); Location mLastLocation; Boolean stopService = false; Intent intent; @@ -82,7 +92,6 @@ public class BackgroundLocalizationService extends Service { new LocationListener(LocationManager.NETWORK_PROVIDER), new LocationListener(LocationManager.PASSIVE_PROVIDER) }; - } @Override @@ -146,23 +155,42 @@ public class BackgroundLocalizationService extends Service { } if (!stopService) { - - mStatusChecker = () -> { try { fn_getlocation(); + changeBackgroundMode(); } finally { mHandler.postDelayed(mStatusChecker, notify_interval); } }; AsyncTask.execute(mStatusChecker); + } + } + + + private void changeBackgroundMode() { + Predicate p2 = v -> !v; + if(coordinatesHistory.size() > 4){ + Boolean shouldExtendTimeInterval = Stream.of(coordinatesHistory) + .map(MapUtils::checkIfCoordinateIsValid).takeWhile( s-> !s).toList().size() == 5; + + if(shouldExtendTimeInterval){ + notify_interval = notify_interval_outside_building; + }else{ + notify_interval = notify_interval_inside_building; + } } + Log.e("COORD_HISTORY", String.valueOf(Stream.of(coordinatesHistory) + .map(MapUtils::checkIfCoordinateIsValid).toList())); + Log.e("COORD_HISTORY", String.valueOf(coordinatesHistory)); + Log.e("NEW INTERVAL", String.valueOf(notify_interval)); } + @RequiresApi(api = Build.VERSION_CODES.O) private void startMyOwnForeground() { @@ -198,29 +226,38 @@ public class BackgroundLocalizationService extends Service { List providers1 = mLocationManager.getProviders(true); Location bestLocation = null; - - - for (String provider : providers1) { - Location location = mLocationManager.getLastKnownLocation(provider); - - if (location == null) { - continue; - } - if (bestLocation == null || location.getAccuracy() < bestLocation.getAccuracy()) { - bestLocation = location; - } - - } - - Log.e("Best localization:", String.valueOf(bestLocation)); + AtomicReference triggerAnotherLocationListener = new AtomicReference<>(false); mFusedLocationClient.getLastLocation().addOnSuccessListener( location -> { if (location != null) { mLastLocation = location; + coordinatesHistory.add(location); fn_update(location); } + + triggerAnotherLocationListener.set(true); }); + + if(triggerAnotherLocationListener.get()){ + for (String provider : providers1) { + Location location = mLocationManager.getLastKnownLocation(provider); + + if (location == null) { + continue; + } + if (bestLocation == null || location.getAccuracy() < bestLocation.getAccuracy()) { + bestLocation = location; + } + } + + coordinatesHistory.add(bestLocation); + Log.e("Best localization:", String.valueOf(bestLocation)); + } + + + + } private void fn_update(Location location) { @@ -333,6 +370,8 @@ public class BackgroundLocalizationService extends Service { approximatedBuildingPart = PrefUtils.getManualLocationApproximation(getApplicationContext()); } + + try { Coordinate coordinate = new Coordinate( latitude, diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/ManualLocationUtils.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/ManualLocationUtils.java index 6de0208..abb59f4 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/ManualLocationUtils.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/ManualLocationUtils.java @@ -44,8 +44,6 @@ public class ManualLocationUtils { activityContext = context; } - - private void handleError(Throwable error) { if (error instanceof HttpException) { From 0cec17dd16e18e04e1dae83847d149cff8713dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mieszko=20Wrzeszczy=C5=84ski?= Date: Thu, 6 Dec 2018 21:32:13 +0100 Subject: [PATCH 2/3] Create handlers for coming in and out from building --- .../uam/wmi/findmytutor/model/Coordinate.java | 5 ++-- .../BackgroundLocalizationService.java | 26 ++++++++++--------- .../com/uam/wmi/findmytutor/utils/Consts.java | 6 ++--- .../uam/wmi/findmytutor/utils/MapUtils.java | 15 +++-------- 4 files changed, 23 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/Coordinate.java b/app/src/main/java/com/uam/wmi/findmytutor/model/Coordinate.java index 9fc2acf..7334350 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/Coordinate.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/Coordinate.java @@ -3,6 +3,7 @@ package com.uam.wmi.findmytutor.model; import android.util.Range; import com.google.gson.annotations.SerializedName; +import com.uam.wmi.findmytutor.utils.Consts; import java.util.Objects; import java.util.UUID; @@ -14,8 +15,8 @@ import io.swagger.annotations.ApiModelProperty; */ public class Coordinate extends BaseResponse { - Range latitudeRange = Range.create(52.46598, 52.467545); - Range longtitudeRange = Range.create(16.926099, 16.927794); + private Range latitudeRange = Consts.latitudeRange; + private Range longtitudeRange = Consts.longitudeRange; @SerializedName("coordinateId") private UUID coordinateId = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java b/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java index 20df4d6..aca3b5f 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java @@ -63,15 +63,15 @@ public class BackgroundLocalizationService extends Service { private static final String TAG = "MyLocationService"; private static final int LOCATION_INTERVAL = 1000; private static final float LOCATION_DISTANCE = 5f; - public static String str_receiver = "background.location.broadcast"; private static long notify_interval = 10000; private static long notify_interval_inside_building = 10000; - private static long notify_interval_outside_building = 20000; + private static long notify_interval_outside_building = 360000; + //private static long notify_interval_outside_building = 900000; - private CircularFifoQueue coordinatesHistory = new CircularFifoQueue(5); + private static int coordinatesHistoryLength = 10; + private CircularFifoQueue coordinatesHistory = new CircularFifoQueue(coordinatesHistoryLength); Location mLastLocation; Boolean stopService = false; - Intent intent; ArrayList providers = new ArrayList(); LocationListener[] mLocationListeners; @@ -171,22 +171,27 @@ public class BackgroundLocalizationService extends Service { private void changeBackgroundMode() { - Predicate p2 = v -> !v; if(coordinatesHistory.size() > 4){ Boolean shouldExtendTimeInterval = Stream.of(coordinatesHistory) - .map(MapUtils::checkIfCoordinateIsValid).takeWhile( s-> !s).toList().size() == 5; + .map(MapUtils::checkIfCoordinateIsValid).takeWhile( s-> !s).toList().size() == coordinatesHistory.size(); + + Boolean shouldAbbreviateTimeInterval = Stream.of(coordinatesHistory). + map(MapUtils::checkIfCoordinateIsValid).toList().get(coordinatesHistory.size() -1); + if(shouldExtendTimeInterval){ notify_interval = notify_interval_outside_building; - }else{ + }else if (shouldAbbreviateTimeInterval){ notify_interval = notify_interval_inside_building; } } Log.e("COORD_HISTORY", String.valueOf(Stream.of(coordinatesHistory) .map(MapUtils::checkIfCoordinateIsValid).toList())); - Log.e("COORD_HISTORY", String.valueOf(coordinatesHistory)); - Log.e("NEW INTERVAL", String.valueOf(notify_interval)); + + Log.e("COORD_HISTORY", String.valueOf(Stream.of(coordinatesHistory) + .map(x -> x.getLatitude() + " " + x.getLongitude()).toList())); + Log.e("COORD_NEW INTERVAL", String.valueOf(notify_interval)); } @@ -255,9 +260,6 @@ public class BackgroundLocalizationService extends Service { Log.e("Best localization:", String.valueOf(bestLocation)); } - - - } private void fn_update(Location location) { diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/Consts.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/Consts.java index 7f03193..4af26c4 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/Consts.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/Consts.java @@ -7,8 +7,8 @@ public class Consts { public final static Integer searchMapZoom = 13; public final static Double presenceLatitude = 52.466365; public final static Double presenceLongitude = 16.926792; - public final static String presenceApproximatedName = "unknown"; - public final static Range latitudeRange = Range.create(52.466709, 52.467007); - public final static Range longtitudeRange = Range.create(16.926159, 16.926976); + public final static String presenceApproximatedName = "Unknown"; + public final static Range latitudeRange = Range.create(52.466092, 52.467529); + public final static Range longitudeRange = Range.create(16.926159, 16.927759); } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/MapUtils.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/MapUtils.java index c75b338..a56ca7e 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/MapUtils.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/MapUtils.java @@ -2,30 +2,21 @@ package com.uam.wmi.findmytutor.utils; import android.animation.TypeEvaluator; import android.content.Context; -import android.graphics.Color; import android.location.Location; -import android.view.Gravity; -import android.view.View; -import android.widget.FrameLayout; -import android.content.res.AssetManager; +import android.util.Log; -import com.mapbox.mapboxsdk.annotations.Polygon; -import com.mapbox.mapboxsdk.annotations.PolygonOptions; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.geometry.LatLngBounds; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; -import com.mapbox.mapboxsdk.style.layers.FillLayer; -import com.mapbox.mapboxsdk.style.layers.Layer; -import com.uam.wmi.findmytutor.model.Coordinate; import java.io.IOException; import java.io.InputStream; import static com.uam.wmi.findmytutor.utils.Consts.latitudeRange; -import static com.uam.wmi.findmytutor.utils.Consts.longtitudeRange; +import static com.uam.wmi.findmytutor.utils.Consts.longitudeRange; public class MapUtils { @@ -85,7 +76,7 @@ public class MapUtils { } public static Boolean checkIfCoordinateIsValid(Location coordinate){ - return (!latitudeRange.contains(coordinate.getLatitude()) && !longtitudeRange.contains(coordinate.getLongitude())); + return latitudeRange.contains(coordinate.getLatitude()) && longitudeRange.contains(coordinate.getLongitude()); } // Function for marker animation From c96e19cb2d675edbe107a54c9554079c6ba78fd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mieszko=20Wrzeszczy=C5=84ski?= Date: Thu, 6 Dec 2018 22:38:22 +0100 Subject: [PATCH 3/3] Fix map --- .../java/com/uam/wmi/findmytutor/activity/MapActivity.java | 3 +-- .../findmytutor/service/BackgroundLocalizationService.java | 5 +++-- app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java index c4ba89f..d98fa2f 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java @@ -439,7 +439,7 @@ public class MapActivity extends BaseActivity } LatLng toDestination = new LatLng(element.getLatitude(), element.getLongitude()); -// TODO fix flickiering markers + ValueAnimator markerAnimator = ObjectAnimator.ofObject(marker, "position", new MapUtils.LatLngEvaluator(), marker.getPosition(), @@ -606,7 +606,6 @@ public class MapActivity extends BaseActivity super.onStop(); mapView.onStop(); shouldFetchNewCoords = false; - } @Override diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java b/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java index d2000fc..715473e 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java @@ -49,6 +49,7 @@ import io.reactivex.observers.DisposableSingleObserver; import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; +import static com.uam.wmi.findmytutor.utils.Const.defaultBackgroundLocationInterval; import static com.uam.wmi.findmytutor.utils.Const.presenceApproximatedName; import static com.uam.wmi.findmytutor.utils.Const.presenceLatitude; import static com.uam.wmi.findmytutor.utils.Const.presenceLongitude; @@ -59,8 +60,8 @@ public class BackgroundLocalizationService extends Service { private static final String TAG = "MyLocationService"; private static final int LOCATION_INTERVAL = 1000; private static final float LOCATION_DISTANCE = 5f; - private static long notify_interval = 10000; - private static long notify_interval_inside_building = 10000; + private static long notify_interval = defaultBackgroundLocationInterval; + private static long notify_interval_inside_building = defaultBackgroundLocationInterval; private static long notify_interval_outside_building = 360000; private static int coordinatesHistoryLength = 10; private Location mLastLocation; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java index e37fd1f..fa92616 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.List; public class Const { + public final static Integer defaultBackgroundLocationInterval = 15000; public final static Integer defaultMapZoom = 17; public final static Integer searchMapZoom = 13; public final static Double presenceLatitude = 52.466365;