summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormvglasow <michael@vonglasow.com>2022-10-15 21:10:48 +0200
committerGitHub <noreply@github.com>2022-10-15 21:10:48 +0200
commitaae00d4b1ef8b3bf504e5c57c0a237e7b4d40b78 (patch)
tree7e3af1b287165e4543dcddfe929559601efc1a3e
parent54df12328befc56429d6337df7bc093d8a3401bc (diff)
downloadnavit-aae00d4b1ef8b3bf504e5c57c0a237e7b4d40b78.tar.gz
Fix:vehicle/android:Never use fused provider for precise location (#1202)
Signed-off-by: mvglasow <michael -at- vonglasow.com> Signed-off-by: mvglasow <michael -at- vonglasow.com> Co-authored-by: mvglasow <michael -at- vonglasow.com>
-rw-r--r--navit/android/src/org/navitproject/navit/NavitVehicle.java73
1 files changed, 71 insertions, 2 deletions
diff --git a/navit/android/src/org/navitproject/navit/NavitVehicle.java b/navit/android/src/org/navitproject/navit/NavitVehicle.java
index e72679c3e..95eb68ef7 100644
--- a/navit/android/src/org/navitproject/navit/NavitVehicle.java
+++ b/navit/android/src/org/navitproject/navit/NavitVehicle.java
@@ -34,6 +34,7 @@ import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.util.Log;
+import java.util.HashSet;
import java.util.List;
@@ -163,10 +164,78 @@ public class NavitVehicle {
Log.d("NavitVehicle", "Providers " + sLocationManager.getAllProviders());
- String mPreciseProvider = sLocationManager.getBestProvider(highCriteria, false);
+ HashSet<String> preciseProviders;
+ try {
+ preciseProviders = new HashSet<String>(sLocationManager.getProviders(highCriteria, false));
+ } catch (NullPointerException e) {
+ preciseProviders = new HashSet<String>();
+ }
+ HashSet<String> fastProviders;
+ try {
+ fastProviders = new HashSet<String>(sLocationManager.getProviders(lowCriteria, false));
+ } catch (NullPointerException e) {
+ fastProviders = new HashSet<String>();
+ }
+ /*
+ * Never use the passive and fused providers for the precise providers.
+ * These merge data from multiple sources, which can lead to your location skipping back and
+ * forth between two places. While that may be acceptable for the fast provider (just to get a
+ * first location), it may render navigation unusable if such a provider were to be used as the
+ * precise provider.
+ */
+ preciseProviders.remove(LocationManager.PASSIVE_PROVIDER);
+ preciseProviders.remove("fused");
+
+ /*
+ * Some magic to pick the precise provider:
+ * If Android’s best chosen provider is on our list, use that.
+ * Otherwise, if the list has only one candidate, use that.
+ * Otherwise, prefer GPS for the precise provider, if available.
+ * Otherwise, just pick a random provider from the list.
+ */
+ Log.d("NavitVehicle", "Precise Provider candidates " + preciseProviders);
+ String mPreciseProvider = null;
+ if (preciseProviders.contains(sLocationManager.getBestProvider(highCriteria, false)))
+ mPreciseProvider = sLocationManager.getBestProvider(highCriteria, false);
+ else if (preciseProviders.size() == 1)
+ for (String provider : preciseProviders)
+ mPreciseProvider = provider;
+ else if (preciseProviders.contains(LocationManager.GPS_PROVIDER))
+ mPreciseProvider = LocationManager.GPS_PROVIDER;
+ else
+ /*
+ * Multiple providers, but no GPS, nor any fused/passive providers, and we can’t use the
+ * best provider suggested by the OS.
+ * If we ever get here, we’re on a very exotic device.
+ * This may need some more tweaks – right now, we just pick one at random.
+ */
+ for (String provider : preciseProviders) {
+ mPreciseProvider = provider;
+ break;
+ }
Log.d("NavitVehicle", "Precise Provider " + mPreciseProvider);
- mFastProvider = sLocationManager.getBestProvider(lowCriteria, false);
+
+ /*
+ * Similar magic to pick the fast provider:
+ * Eliminate the precise provider from our list so we get to use two providers.
+ * If Android’s best chosen provider is on our list, use that.
+ * Otherwise, if the list has only one candidate, use that.
+ * Otherwise, just pick a random provider from the list.
+ */
+ fastProviders.remove(mPreciseProvider);
+ Log.d("NavitVehicle", "Fast Provider candidates " + fastProviders);
+ if (fastProviders.contains(sLocationManager.getBestProvider(lowCriteria, false)))
+ mFastProvider = sLocationManager.getBestProvider(lowCriteria, false);
+ else if (fastProviders.size() == 1)
+ for (String provider: fastProviders)
+ mFastProvider = provider;
+ else
+ for (String provider: fastProviders) {
+ mFastProvider = provider;
+ break;
+ }
Log.d("NavitVehicle", "Fast Provider " + mFastProvider);
+
mVehiclePcbid = pcbid;
mVehicleScbid = scbid;
mVehicleFcbid = fcbid;