aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/utils
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2018-01-07 22:32:23 +0100
committerChristian Schneppe <christian@pix-art.de>2018-01-07 22:32:23 +0100
commit8cf20a8222ee1102edbe47ebec312862042bb0c9 (patch)
tree77a82c956c69c2e50b8932a5ac7621a347994e77 /src/main/java/de/pixart/messenger/utils
parentb5c137202813059e5ab135f297072118d4cd347a (diff)
reworked location services from GoogleMap to OSM
Diffstat (limited to 'src/main/java/de/pixart/messenger/utils')
-rw-r--r--src/main/java/de/pixart/messenger/utils/LocationHelper.java51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/main/java/de/pixart/messenger/utils/LocationHelper.java b/src/main/java/de/pixart/messenger/utils/LocationHelper.java
new file mode 100644
index 000000000..85226bcd1
--- /dev/null
+++ b/src/main/java/de/pixart/messenger/utils/LocationHelper.java
@@ -0,0 +1,51 @@
+package de.pixart.messenger.utils;
+
+import android.location.Location;
+
+import de.pixart.messenger.Config;
+
+public final class LocationHelper {
+ private static boolean isSameProvider(final String provider1, final String provider2) {
+ if (provider1 == null) {
+ return provider2 == null;
+ }
+ return provider1.equals(provider2);
+ }
+
+ public static boolean isBetterLocation(final Location location, final Location prevLoc) {
+ if (prevLoc == null) {
+ return true;
+ }
+
+ // Check whether the new location fix is newer or older
+ final long timeDelta = location.getTime() - prevLoc.getTime();
+ final boolean isSignificantlyNewer = timeDelta > Config.LOCATION_FIX_SIGNIFICANT_TIME_DELTA;
+ final boolean isSignificantlyOlder = timeDelta < -Config.LOCATION_FIX_SIGNIFICANT_TIME_DELTA;
+ final boolean isNewer = timeDelta > 0;
+
+ if (isSignificantlyNewer) {
+ return true;
+ } else if (isSignificantlyOlder) {
+ return false;
+ }
+
+ // Check whether the new location fix is more or less accurate
+ final int accuracyDelta = (int) (location.getAccuracy() - prevLoc.getAccuracy());
+ final boolean isLessAccurate = accuracyDelta > 0;
+ final boolean isMoreAccurate = accuracyDelta < 0;
+ final boolean isSignificantlyLessAccurate = accuracyDelta > 200;
+
+ // Check if the old and new location are from the same provider
+ final boolean isFromSameProvider = isSameProvider(location.getProvider(), prevLoc.getProvider());
+
+ // Determine location quality using a combination of timeliness and accuracy
+ if (isMoreAccurate) {
+ return true;
+ } else if (isNewer && !isLessAccurate) {
+ return true;
+ } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
+ return true;
+ }
+ return false;
+ }
+}